all the rest is the fixes to the import by Niklas.
-/* $OpenBSD: ip_output.c,v 1.4 1996/03/03 22:30:41 niklas Exp $ */
+/* $OpenBSD: ip_output.c,v 1.5 1996/03/04 10:34:33 mickey Exp $ */
/* $NetBSD: ip_output.c,v 1.28 1996/02/13 23:43:07 christos Exp $ */
/*
static void ip_mloopback
__P((struct ifnet *, struct mbuf *, struct sockaddr_in *));
#if defined(IPFILTER) || defined(IPFILTER_LKM)
-extern int (*fr_checkp) __P((struct ip *, int, struct ifnet *, int, struct mbuf **));
+int (*fr_checkp) __P((struct ip *, int, struct ifnet *, int, struct mbuf **));
#endif
/*
-/* $NetBSD: argo_debug.h,v 1.6 1995/08/16 00:38:53 mycroft Exp $ */
+/* $OpenBSD: argo_debug.h,v 1.2 1996/03/04 10:34:40 mickey Exp $ */
+/* $NetBSD: argo_debug.h,v 1.7 1996/02/13 22:07:57 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
#ifndef _NETISO_ARGO_DEBUG_H_
#define _NETISO_ARGO_DEBUG_H_
-
+void Dump_buf __P((caddr_t, int));
#define dump_buf(a, b) Dump_buf((caddr_t)(a), (int)(b))
-/***********************************************
- * Lint stuff
- **********************************************/
-#if defined(lint)
-/*
- * lint can't handle the flaky vacuous definitions
- * of IFDEBUG, ENDDEBUG, etc.
- */
-#endif /* defined(lint) */
-
/***********************************************
* DEBUG ON:
**********************************************/
#ifndef ARGO_DEBUG
#define ARGO_DEBUG
-#endif /* ARGO_DEBUG */
+#endif /* ARGO_DEBUG */
#ifdef ARGO_DEBUG
#endif TP_PERF_MEAS
*/
-unsigned char argo_debug[128];
-
-#define IFDEBUG(ascii) \
- if(argo_debug[ascii]) {
-#define ENDDEBUG ; }
+unsigned char argo_debug[128];
-#else /* ARGO_DEBUG */
+#endif /* ARGO_DEBUG */
/***********************************************
- * DEBUG OFF:
- **********************************************/
-
-#ifndef STAR
-#define STAR *
-#endif /* STAR */
-#define IFDEBUG(ascii) //*beginning of comment*/STAR
-#define ENDDEBUG STAR/*end of comment*//
-
-#endif /* ARGO_DEBUG */
-
-/***********************************************
- * ASSERT
+ * ASSERT
**********************************************/
#ifdef ARGO_DEBUG
#ifndef lint
#define ASSERT(phrase) \
if( !(phrase) ) printf("ASSERTION NOT VALID at line %d file %s\n",__LINE__,__FILE__)
-#else /* lint */
-#define ASSERT(phrase) /* phrase */
-#endif /* lint */
+#else /* lint */
+#define ASSERT(phrase) /* phrase */
+#endif /* lint */
-#else /* ARGO_DEBUG */
+#else /* ARGO_DEBUG */
-#define ASSERT(phrase) /* phrase */
+#define ASSERT(phrase) /* phrase */
-#endif /* ARGO_DEBUG */
+#endif /* ARGO_DEBUG */
/***********************************************
/* clnp over token ring */
#define D_ADCOM '\12'
/* clnp over the adcom */
-#define D_ISO '\13'
+#define D_ISO '\13'
/* iso address family */
#define D_FORWARD '\14'
/* clnp forwarding */
#define D_DUMPOUT '\15'
/* dump clnp outgoing packets */
-#define D_DUMPIN '\16'
+#define D_DUMPIN '\16'
/* dump clnp input packets */
-#define D_DISCARD '\17'
+#define D_DISCARD '\17'
/* debug clnp packet discard/er function */
-#define D_FRAG '\20'
+#define D_FRAG '\20'
/* clnp fragmentation */
-#define D_REASS '\21'
+#define D_REASS '\21'
/* clnp reassembly */
-char *clnp_iso_addrp();
-
/***********************************************
* ESIS DEBUG OPTIONS
**********************************************/
#define D_TPISO '\176'
#define D_QUENCH '\177'
-void dump_mbuf();
-
/***********************************************
* New mbuf types for debugging w/ netstat -m
* This messes up 4.4 malloc for now. need bigger
#define TPMT_EOT 0x40
#define TPMT_XPD 0x44
-#else /* ARGO_DEBUG */
+#else /* ARGO_DEBUG */
#define TPMT_DATA MT_DATA
+#define TPMT_RCVRTC MT_DATA
+#define TPMT_SNDRTC MT_DATA
#define TPMT_IPHDR MT_HEADER
#define TPMT_TPHDR MT_HEADER
#define TPMT_SONAME MT_SONAME
/* MT_EOT and MT_XPD are defined in tp_param.h */
#define TPMT_XPD MT_OOBDATA
-#endif /* ARGO_DEBUG */
+#endif /* ARGO_DEBUG */
-#endif /* _NETISO_ARGO_DEBUG_H_ */
+#endif /* _NETISO_ARGO_DEBUG_H_ */
-/* $NetBSD: clnl.h,v 1.5 1994/06/29 06:39:04 cgd Exp $ */
+/* $OpenBSD: clnl.h,v 1.2 1996/03/04 10:34:42 mickey Exp $ */
+/* $NetBSD: clnl.h,v 1.6 1996/02/13 22:08:02 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
* ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison
*/
struct clnl_protosw {
- void (*clnl_input)(); /* input routine */
+ /* input routine */
+ void (*clnl_input) __P((struct mbuf *, ...));
};
-/* $NetBSD: clnp.h,v 1.9 1995/06/13 07:13:14 mycroft Exp $ */
+/* $OpenBSD: clnp.h,v 1.2 1996/03/04 10:34:44 mickey Exp $ */
+/* $NetBSD: clnp.h,v 1.10 1996/02/13 22:08:09 christos Exp $ */
/*-
* Copyright (c) 1991, 1993, 1994
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
* 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 */
+ 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 */
};
#define CNF_TYPE 0x1f
#define CNF_ERR_OK 0x20
* 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 */
+ 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
+ * 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
+ * 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
/*
* NOTE:
- * The clnp_frag structure is stored in an mbuf immedately preceeding
- * the fragment data. Since there are words in this struct,
- * it must be word aligned.
+ * The clnp_frag structure is stored in an mbuf immedately
+ * preceeding 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.
+ * 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 */
+ 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 */
+ 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 */
};
/*
* does not include the option code or option length fields.
*/
struct clnp_optidx {
- u_short cni_securep; /* ptr to beginning of security option */
- char cni_secure_len; /* length of entire security option */
+ 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_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 */
+ 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 */
+ 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_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 */
+ u_char cni_er_reason; /* reason from ER pdu option */
- /* ESIS options */
+ /* ESIS options */
- u_short cni_esct; /* value from ISH ESCT option */
+ 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_netmaskp; /* ptr to beginning of netmask option */
+ char cni_netmask_len; /* length of entire netmask
+ * option */
- u_short cni_snpamaskp; /* ptr to beginning of snpamask option */
- char cni_snpamask_len; /* length of entire snpamask 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)))
+#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))
+#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 true iff src route is valid */
+#define CLNPSRCRT_VALID(oidx) ((oidx) && (oidx->cni_srcrt_s))
-/* return the offset field of the src rt */
+/* 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 */
+/* return the type field of the src rt */
#define CLNPSRCRT_TYPE(oidx, options)\
((u_char)(*(CLNP_OFFTOOPT(options, oidx->cni_srcrt_s))))
#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
+/*
+ * 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)
#define CLNPOVAL_COMPRT 0x01 /* complete source routing */
/*
- * Clnp flags used in a control block flags field.
+ * 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 rather than TP DT */
-#define CLNP_NO_CKSUM 0x100 /* don't use clnp checksum */
+#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_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)
+#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
+/*
+ * 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
+#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.
+ * 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 */
/*
* ER pdu error codes
*/
-#define GEN_NOREAS 0x00 /* reason not specified */
+#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_BADCSUM 0x02 /* incorrect checksum */
+#define GEN_CONGEST 0x03 /* pdu discarded due to congestion */
#define GEN_HDRSYNTAX 0x04 /* header syntax error */
-#define GEN_SEGNEEDED 0x05 /* segmentation needed, but not permitted */
+#define GEN_SEGNEEDED 0x05 /* need segmentation but not allowed */
#define GEN_INCOMPLETE 0x06 /* incomplete pdu received */
-#define GEN_DUPOPT 0x07 /* duplicate option */
+#define GEN_DUPOPT 0x07 /* duplicate option */
/* address errors */
#define ADDR_DESTUNREACH 0x80 /* destination address unreachable */
#define CLNP_ERRORS 22
-#ifdef _KERNEL
-int clnp_er_index();
-#endif
-
#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 };
+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_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 */
+#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 */
+ 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)\
- trollctl.tr_mtu_adj)
#ifdef _KERNEL
-extern float troll_random;
+extern float troll_random;
#endif
-#else /* NO TROLL */
+#else /* NO TROLL */
#define SN_OUTPUT(clcp, m)\
- (*clcp->clc_ifp->if_output)(clcp->clc_ifp, m, clcp->clc_firsthop, clcp->clc_rt)
+ (*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 */
+#endif /* TROLL */
/*
* Macro to remove an address from a clnp header
(isoa.isoa_len > 20) || (isoa.isoa_len == 0)) {\
hoff = (caddr_t)0;\
} else {\
- (void) bcopy(hoff, (caddr_t)isoa.isoa_genaddr, isoa.isoa_len);\
+ (void) bcopy(hoff, (caddr_t)isoa.isoa_genaddr, \
+ isoa.isoa_len);\
hoff += isoa.isoa_len;\
}\
}
*/
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 */
+ 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)! */
+ 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
-caddr_t clnp_insert_addr();
-struct iso_addr *clnp_srcaddr();
-struct mbuf *clnp_reass();
+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 *));
+
+/* 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 */
+struct troll trollctl;
+#endif /* TROLL */
+
+#endif /* _KERNEL */
-/* $NetBSD: clnp_debug.c,v 1.5 1994/06/29 06:39:07 cgd Exp $ */
+/* $OpenBSD: clnp_debug.c,v 1.2 1996/03/04 10:34:46 mickey Exp $ */
+/* $NetBSD: clnp_debug.c,v 1.6 1996/02/13 22:08:13 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
#include <sys/socket.h>
#include <sys/socketvar.h>
#include <sys/errno.h>
+#include <sys/systm.h>
#include <net/if.h>
#include <net/route.h>
#ifdef TESTDEBUG
#ifdef notdef
-struct addr_37 u_37 = {
- {0x00, 0x02, 0x00, 0x10, 0x20, 0x30, 0x35},
+struct addr_37 u_37 = {
+ {0x00, 0x02, 0x00, 0x10, 0x20, 0x30, 0x35},
{0x01, 0x02, 0x03, 0x04, 0x50, 0x60, 0x70, 0x80, 0x90}
};
struct addr_osinet u_osinet = {
{0x00, 0x04},
{0x00, 0x02, 0x00, 0x01, 0x23, 0x42, 0x78, 0x20, 0x01, 0x05, 0x00}
};
-#endif /* notdef */
+#endif /* notdef */
struct addr_rfc986 u_rfc986 = {
{0x00, 0x06},
{0x01, 0xc0, 0x0c, 0x0c, 0xab, 0x11}
{0x00, 0x01},
{0x01, 0xc0, 0x0c, 0x0c, 0xab, 0x11}
};
+int main __P((void));
+
#include <stdio.h>
+int
main()
{
- struct iso_addr a;
+ struct iso_addr a;
a.isoa_afi = AFI_37;
a.isoa_u.addr_37 = u_37;
a.isoa_u.addr_rfc986 = u_bad;
a.isoa_len = 9;
printf("type bad idi: %s\n", clnp_iso_addrp(&a));
+ return 0;
}
-#endif /* TESTDEBUG */
+#endif /* TESTDEBUG */
-unsigned int clnp_debug;
-static char letters[] = "0123456789abcdef";
+unsigned int clnp_debug;
+static char letters[] = "0123456789abcdef";
+
+char *clnp_hexp __P((char *, int, char *));
+char *clnp_iso_addrp __P((struct iso_addr *));
+char *clnp_saddr_isop __P((struct sockaddr_iso *));
/*
* Print buffer in hex, return addr of where we left off.
*/
char *
clnp_hexp(src, len, where)
-char *src; /* src of data to print */
-int len; /* lengthof src */
-char *where; /* where to put data */
+ char *src; /* src of data to print */
+ int len; /* lengthof src */
+ char *where; /* where to put data */
{
- int i;
+ int i;
- for (i=0; i<len; i++) {
- register int j = ((u_char *)src)[i];
+ for (i = 0; i < len; i++) {
+ register int j = ((u_char *) src)[i];
*where++ = letters[j >> 4];
*where++ = letters[j & 0x0f];
}
}
/*
- * Return a ptr to a human readable form of an iso addr
+ * Return a ptr to a human readable form of an iso addr
*/
-static char iso_addr_b[50];
+static char iso_addr_b[50];
#define DELIM '.';
char *
clnp_iso_addrp(isoa)
-struct iso_addr *isoa;
+ struct iso_addr *isoa;
{
- char *cp;
+ char *cp;
+#ifdef notdef
+ u_short idi;
+#endif
/* print length */
sprintf(iso_addr_b, "[%d] ", isoa->isoa_len);
cp++;
/* print afi */
- cp = clnp_hexp(isoa->isoa_genaddr, (int)isoa->isoa_len, cp);
+ cp = clnp_hexp(isoa->isoa_genaddr, (int) isoa->isoa_len, cp);
#ifdef notdef
*cp++ = DELIM;
/* print type specific part */
- switch(isoa->isoa_afi) {
- case AFI_37:
- cp = clnp_hexp(isoa->t37_idi, ADDR37_IDI_LEN, cp);
+ switch (isoa->isoa_afi) {
+ case AFI_37:
+ cp = clnp_hexp(isoa->t37_idi, ADDR37_IDI_LEN, cp);
+ *cp++ = DELIM;
+ cp = clnp_hexp(isoa->t37_dsp, ADDR37_DSP_LEN, cp);
+ break;
+
+ /* case AFI_OSINET: */
+ case AFI_RFC986:
+
+ /* osinet and rfc986 have idi in the same place */
+ /* print idi */
+ cp = clnp_hexp(isoa->rfc986_idi,
+ ADDROSINET_IDI_LEN, cp);
+ *cp++ = DELIM;
+ CTOH(isoa->rfc986_idi[0], isoa->rfc986_idi[1], idi);
+
+ if (idi == IDI_OSINET) {
+ struct ovl_osinet *oosi = (struct ovl_osinet *) isoa;
+ cp = clnp_hexp(oosi->oosi_orgid,
+ OVLOSINET_ORGID_LEN, cp);
*cp++ = DELIM;
- cp = clnp_hexp(isoa->t37_dsp, ADDR37_DSP_LEN, cp);
- break;
-
-/* case AFI_OSINET:*/
- case AFI_RFC986: {
- u_short idi;
-
- /* osinet and rfc986 have idi in the same place */
- /* print idi */
- cp = clnp_hexp(isoa->rfc986_idi, ADDROSINET_IDI_LEN, cp);
+ cp = clnp_hexp(oosi->oosi_snetid,
+ OVLOSINET_SNETID_LEN, cp);
+ *cp++ = DELIM;
+ cp = clnp_hexp(oosi->oosi_snpa, OVLOSINET_SNPA_LEN, cp);
+ *cp++ = DELIM;
+ cp = clnp_hexp(oosi->oosi_nsap, OVLOSINET_NSAP_LEN, cp);
+ } else if (idi == IDI_RFC986) {
+ struct ovl_rfc986 *o986 = (struct ovl_rfc986 *) isoa;
+ cp = clnp_hexp(&o986->o986_vers, 1, cp);
*cp++ = DELIM;
- CTOH(isoa->rfc986_idi[0], isoa->rfc986_idi[1], idi);
-
- if (idi == IDI_OSINET) {
- struct ovl_osinet *oosi = (struct ovl_osinet *)isoa;
- cp = clnp_hexp(oosi->oosi_orgid, OVLOSINET_ORGID_LEN, cp);
- *cp++ = DELIM;
- cp = clnp_hexp(oosi->oosi_snetid, OVLOSINET_SNETID_LEN, cp);
- *cp++ = DELIM;
- cp = clnp_hexp(oosi->oosi_snpa, OVLOSINET_SNPA_LEN, cp);
- *cp++ = DELIM;
- cp = clnp_hexp(oosi->oosi_nsap, OVLOSINET_NSAP_LEN, cp);
- } else if (idi == IDI_RFC986) {
- struct ovl_rfc986 *o986 = (struct ovl_rfc986 *)isoa;
- cp = clnp_hexp(&o986->o986_vers, 1, cp);
- *cp++ = DELIM;
#ifdef vax
- sprintf(cp, "%d.%d.%d.%d.%d",
+ sprintf(cp, "%d.%d.%d.%d.%d",
o986->o986_inetaddr[0] & 0xff,
o986->o986_inetaddr[1] & 0xff,
o986->o986_inetaddr[2] & 0xff,
o986->o986_inetaddr[3] & 0xff,
o986->o986_upid & 0xff);
- return(iso_addr_b);
+ return (iso_addr_b);
#else
- cp = clnp_hexp(&o986->o986_inetaddr[0], 1, cp);
- *cp++ = DELIM;
- cp = clnp_hexp(&o986->o986_inetaddr[1], 1, cp);
- *cp++ = DELIM;
- cp = clnp_hexp(&o986->o986_inetaddr[2], 1, cp);
- *cp++ = DELIM;
- cp = clnp_hexp(&o986->o986_inetaddr[3], 1, cp);
- *cp++ = DELIM;
- cp = clnp_hexp(&o986->o986_upid, 1, cp);
-#endif /* vax */
- }
-
- } break;
-
- default:
- *cp++ = '?';
- break;
+ cp = clnp_hexp(&o986->o986_inetaddr[0], 1, cp);
+ *cp++ = DELIM;
+ cp = clnp_hexp(&o986->o986_inetaddr[1], 1, cp);
+ *cp++ = DELIM;
+ cp = clnp_hexp(&o986->o986_inetaddr[2], 1, cp);
+ *cp++ = DELIM;
+ cp = clnp_hexp(&o986->o986_inetaddr[3], 1, cp);
+ *cp++ = DELIM;
+ cp = clnp_hexp(&o986->o986_upid, 1, cp);
+#endif /* vax */
+ }
+ break;
+
+ default:
+ *cp++ = '?';
+ break;
}
#endif /* notdef */
- *cp = (char)0;
-
- return(iso_addr_b);
+ *cp = (char) 0;
+
+ return (iso_addr_b);
}
char *
clnp_saddr_isop(s)
-register struct sockaddr_iso *s;
+ register struct sockaddr_iso *s;
{
- register char *cp = clnp_iso_addrp(&s->siso_addr);
+ register char *cp = clnp_iso_addrp(&s->siso_addr);
- while (*cp) cp++;
+ while (*cp)
+ cp++;
*cp++ = '(';
- cp = clnp_hexp(TSEL(s), (int)s->siso_tlen, cp);
+ cp = clnp_hexp(TSEL(s), (int) s->siso_tlen, cp);
*cp++ = ')';
*cp++ = 0;
return (iso_addr_b);
}
-#endif /* ARGO_DEBUG */
+#endif /* ARGO_DEBUG */
-/* $NetBSD: clnp_er.c,v 1.6 1995/06/13 07:13:17 mycroft Exp $ */
+/* $OpenBSD: clnp_er.c,v 1.2 1996/03/04 10:34:48 mickey Exp $ */
+/* $NetBSD: clnp_er.c,v 1.7 1996/02/13 22:08:17 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
#include <sys/socket.h>
#include <sys/socketvar.h>
#include <sys/errno.h>
+#include <sys/systm.h>
#include <net/if.h>
#include <net/route.h>
#include <netiso/clnp.h>
#include <netiso/clnp_stat.h>
#include <netiso/argo_debug.h>
+#include <netiso/tp_param.h>
+#include <netiso/tp_var.h>
static struct clnp_fixed er_template = {
- ISO8473_CLNP, /* network identifier */
- 0, /* length */
+ ISO8473_CLNP, /* network identifier */
+ 0, /* length */
ISO8473_V1, /* version */
CLNP_TTL, /* ttl */
CLNP_ER, /* type */
- 0, /* segment length */
- 0 /* checksum */
+ 0, /* segment length */
+ 0 /* checksum */
};
/*
*
* PURPOSE: Process an ER pdu.
*
- * RETURNS:
+ * RETURNS:
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
*/
+void
clnp_er_input(m, src, reason)
-struct mbuf *m; /* ptr to packet itself */
-struct iso_addr *src; /* ptr to src of er */
-u_char reason; /* reason code of er */
+ struct mbuf *m; /* ptr to packet itself */
+ struct iso_addr *src; /* ptr to src of er */
+ u_int reason; /* reason code of er */
{
- int cmd = -1;
- extern u_char clnp_protox[];
+ int cmd = -1;
- IFDEBUG(D_CTLINPUT)
- printf("clnp_er_input: m x%x, src %s, reason x%x\n", m,
- clnp_iso_addrp(src), reason);
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CTLINPUT]) {
+ printf("clnp_er_input: m x%x, src %s, reason x%x\n",
+ (unsigned int) m, clnp_iso_addrp(src), reason);
+ }
+#endif
INCSTAT(cns_er_inhist[clnp_er_index(reason)]);
switch (reason) {
- case GEN_NOREAS:
- case GEN_PROTOERR:
- break;
- case GEN_BADCSUM:
- cmd = PRC_PARAMPROB;
- break;
- case GEN_CONGEST:
- cmd = PRC_QUENCH;
- break;
- case GEN_HDRSYNTAX:
- cmd = PRC_PARAMPROB;
- break;
- case GEN_SEGNEEDED:
- cmd = PRC_MSGSIZE;
- break;
- case GEN_INCOMPLETE:
- cmd = PRC_PARAMPROB;
- break;
- case GEN_DUPOPT:
- cmd = PRC_PARAMPROB;
- break;
- case ADDR_DESTUNREACH:
- cmd = PRC_UNREACH_HOST;
- break;
- case ADDR_DESTUNKNOWN:
- cmd = PRC_UNREACH_PROTOCOL;
- break;
- case SRCRT_UNSPECERR:
- case SRCRT_SYNTAX:
- case SRCRT_UNKNOWNADDR:
- case SRCRT_BADPATH:
- cmd = PRC_UNREACH_SRCFAIL;
- break;
- case TTL_EXPTRANSIT:
- cmd = PRC_TIMXCEED_INTRANS;
- break;
- case TTL_EXPREASS:
- cmd = PRC_TIMXCEED_REASS;
- break;
- case DISC_UNSUPPOPT:
- case DISC_UNSUPPVERS:
- case DISC_UNSUPPSECURE:
- case DISC_UNSUPPSRCRT:
- case DISC_UNSUPPRECRT:
- cmd = PRC_PARAMPROB;
- break;
- case REASS_INTERFERE:
- cmd = PRC_TIMXCEED_REASS;
- break;
+ case GEN_NOREAS:
+ case GEN_PROTOERR:
+ break;
+ case GEN_BADCSUM:
+ cmd = PRC_PARAMPROB;
+ break;
+ case GEN_CONGEST:
+ cmd = PRC_QUENCH;
+ break;
+ case GEN_HDRSYNTAX:
+ cmd = PRC_PARAMPROB;
+ break;
+ case GEN_SEGNEEDED:
+ cmd = PRC_MSGSIZE;
+ break;
+ case GEN_INCOMPLETE:
+ cmd = PRC_PARAMPROB;
+ break;
+ case GEN_DUPOPT:
+ cmd = PRC_PARAMPROB;
+ break;
+ case ADDR_DESTUNREACH:
+ cmd = PRC_UNREACH_HOST;
+ break;
+ case ADDR_DESTUNKNOWN:
+ cmd = PRC_UNREACH_PROTOCOL;
+ break;
+ case SRCRT_UNSPECERR:
+ case SRCRT_SYNTAX:
+ case SRCRT_UNKNOWNADDR:
+ case SRCRT_BADPATH:
+ cmd = PRC_UNREACH_SRCFAIL;
+ break;
+ case TTL_EXPTRANSIT:
+ cmd = PRC_TIMXCEED_INTRANS;
+ break;
+ case TTL_EXPREASS:
+ cmd = PRC_TIMXCEED_REASS;
+ break;
+ case DISC_UNSUPPOPT:
+ case DISC_UNSUPPVERS:
+ case DISC_UNSUPPSECURE:
+ case DISC_UNSUPPSRCRT:
+ case DISC_UNSUPPRECRT:
+ cmd = PRC_PARAMPROB;
+ break;
+ case REASS_INTERFERE:
+ cmd = PRC_TIMXCEED_REASS;
+ break;
}
/*
/*
* FUNCTION: clnp_discard
*
- * PURPOSE: Discard a clnp datagram
+ * PURPOSE: Discard a clnp datagram
*
- * RETURNS: nothing
+ * RETURNS: nothing
*
* SIDE EFFECTS: Will emit an ER pdu if possible
*
- * NOTES: This code assumes that we have previously tried to pull
- * up the header of the datagram into one mbuf.
+ * NOTES: This code assumes that we have previously tried to pull
+ * up the header of the datagram into one mbuf.
*/
+void
clnp_discard(m, reason)
-struct mbuf *m; /* header of packet to discard */
-char reason; /* reason for discard */
+ struct mbuf *m; /* header of packet to discard */
+ u_int reason; /* reason for discard */
{
- IFDEBUG(D_DISCARD)
- printf("clnp_discard: m x%x, reason x%x\n", m, reason);
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_DISCARD]) {
+ printf("clnp_discard: m x%x, reason x%x\n",
+ (unsigned int) m, reason);
+ }
+#endif
if (m != NULL) {
if (m->m_len >= sizeof(struct clnp_fixed)) {
- register struct clnp_fixed *clnp = mtod(m, struct clnp_fixed *);
+ register struct clnp_fixed *clnp =
+ mtod(m, struct clnp_fixed *);
if (((clnp->cnf_type & CNF_TYPE) != CLNP_ER) &&
- (clnp->cnf_type & CNF_ERR_OK)) {
- clnp_emit_er(m, reason);
- return;
+ (clnp->cnf_type & CNF_ERR_OK)) {
+ clnp_emit_er(m, reason);
+ return;
}
}
m_freem(m);
/*
* FUNCTION: clnp_emit_er
*
- * PURPOSE: Send an ER pdu.
- * The src of the of the ER pdu is the host that is sending
- * the ER (ie. us), *not* the original destination of the
- * packet.
+ * PURPOSE: Send an ER pdu.
+ * The src of the of the ER pdu is the host that is sending
+ * the ER (ie. us), *not* the original destination of the
+ * packet.
*
- * RETURNS: nothing
+ * RETURNS: nothing
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES: Takes responsibility for freeing mbuf passed
- * This function may be called with a packet that
- * was created by us; in this case, do not send
- * an ER.
+ * NOTES: Takes responsibility for freeing mbuf passed
+ * This function may be called with a packet that
+ * was created by us; in this case, do not send
+ * an ER.
*/
+void
clnp_emit_er(m, reason)
-struct mbuf *m; /* header of packet to discard */
-char reason; /* reason for discard */
+ struct mbuf *m; /* header of packet to discard */
+ u_int reason; /* reason for discard */
{
- register struct clnp_fixed *clnp = mtod(m, struct clnp_fixed *);
- register struct clnp_fixed *er;
- struct route_iso route;
- struct ifnet *ifp;
- struct sockaddr *first_hop;
- struct iso_addr src, dst, *our_addr;
- caddr_t hoff, hend;
- int total_len; /* total len of dg */
- struct mbuf *m0; /* contains er pdu hdr */
- struct iso_ifaddr *ia = 0;
-
- IFDEBUG(D_DISCARD)
- printf("clnp_emit_er: m x%x, hdr len %d\n", m, clnp->cnf_hdr_len);
- ENDDEBUG
-
- bzero((caddr_t)&route, sizeof(route));
+ register struct clnp_fixed *clnp = mtod(m, struct clnp_fixed *);
+ register struct clnp_fixed *er;
+ struct route_iso route;
+ struct ifnet *ifp;
+ struct sockaddr *first_hop;
+ struct iso_addr src, dst, *our_addr;
+ caddr_t hoff, hend;
+ int total_len; /* total len of dg */
+ struct mbuf *m0; /* contains er pdu hdr */
+ struct iso_ifaddr *ia = 0;
+
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_DISCARD]) {
+ printf("clnp_emit_er: m x%x, hdr len %d\n",
+ (unsigned int) m, clnp->cnf_hdr_len);
+ }
+#endif
+
+ bzero((caddr_t) & route, sizeof(route));
/*
- * If header length is incorrect, or entire header is not contained
- * in this mbuf, we punt
+ * If header length is incorrect, or entire header is not contained
+ * in this mbuf, we punt
*/
if ((clnp->cnf_hdr_len < CLNP_HDR_MIN) ||
- (clnp->cnf_hdr_len > CLNP_HDR_MAX) ||
- (clnp->cnf_hdr_len > m->m_len))
+ (clnp->cnf_hdr_len > CLNP_HDR_MAX) ||
+ (clnp->cnf_hdr_len > m->m_len))
goto bad;
-
+
/* extract src, dest address */
- hend = (caddr_t)clnp + clnp->cnf_hdr_len;
- hoff = (caddr_t)clnp + sizeof(struct clnp_fixed);
+ hend = (caddr_t) clnp + clnp->cnf_hdr_len;
+ hoff = (caddr_t) clnp + sizeof(struct clnp_fixed);
CLNP_EXTRACT_ADDR(dst, hoff, hend);
- if (hoff == (caddr_t)0) {
+ if (hoff == (caddr_t) 0) {
goto bad;
}
CLNP_EXTRACT_ADDR(src, hoff, hend);
- if (hoff == (caddr_t)0) {
+ if (hoff == (caddr_t) 0) {
goto bad;
}
-
/*
- * Do not send ER if we generated the packet.
+ * Do not send ER if we generated the packet.
*/
if (clnp_ours(&src))
goto bad;
- /*
- * Trim mbuf to hold only the header.
- * This mbuf will be the 'data' of the er pdu
+ /*
+ * Trim mbuf to hold only the header. This mbuf will be the 'data' of
+ * the er pdu
*/
if (m->m_next != NULL) {
m_freem(m->m_next);
m->m_next = NULL;
}
-
if (m->m_len > clnp->cnf_hdr_len)
- m_adj(m, (int)-(m->m_len - (int)clnp->cnf_hdr_len));
+ m_adj(m, (int) -(m->m_len - (int) clnp->cnf_hdr_len));
/* route er pdu: note we send pkt to src of original packet */
- if (clnp_route(&src, &route, /* flags */0, &first_hop, &ia) != 0)
+ if (clnp_route(&src, &route, /* flags */ 0, &first_hop, &ia) != 0)
goto bad;
/* compute our address based upon firsthop/ifp */
if (ia)
- our_addr = &ia->ia_addr.siso_addr;
+ our_addr = &ia->ia_addr.siso_addr;
else
- goto bad;
+ goto bad;
ifp = ia->ia_ifp;
- IFDEBUG(D_DISCARD)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_DISCARD]) {
printf("clnp_emit_er: to %s", clnp_iso_addrp(&src));
printf(" from %s\n", clnp_iso_addrp(our_addr));
- ENDDEBUG
+ }
+#endif
- IFDEBUG(D_DISCARD)
- printf("clnp_emit_er: packet routed to %s\n",
- clnp_iso_addrp(&satosiso(first_hop)->siso_addr));
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_DISCARD]) {
+ printf("clnp_emit_er: packet routed to %s\n",
+ clnp_iso_addrp(&satosiso(first_hop)->siso_addr));
+ }
+#endif
/* allocate mbuf for er pdu header: punt on no space */
MGET(m0, M_DONTWAIT, MT_HEADER);
if (m0 == 0)
goto bad;
-
+
m0->m_next = m;
er = mtod(m0, struct clnp_fixed *);
*er = er_template;
/* setup src/dst on er pdu */
/* NOTE REVERSAL OF SRC/DST */
- hoff = (caddr_t)er + sizeof(struct clnp_fixed);
+ hoff = (caddr_t) er + sizeof(struct clnp_fixed);
CLNP_INSERT_ADDR(hoff, src);
CLNP_INSERT_ADDR(hoff, *our_addr);
/* add er option */
*hoff++ = CLNPOVAL_ERREAS; /* code */
- *hoff++ = 2; /* length */
- *hoff++ = reason; /* discard reason */
- *hoff++ = 0; /* error localization = not specified */
+ *hoff++ = 2; /* length */
+ *hoff++ = reason; /* discard reason */
+ *hoff++ = 0; /* error localization = not specified */
/* set length */
- er->cnf_hdr_len = m0->m_len = (u_char)(hoff - (caddr_t)er);
+ er->cnf_hdr_len = m0->m_len = (u_char) (hoff - (caddr_t) er);
total_len = m0->m_len + m->m_len;
HTOC(er->cnf_seglen_msb, er->cnf_seglen_lsb, total_len);
/* compute checksum (on header only) */
- iso_gen_csum(m0, CLNP_CKSUM_OFF, (int)er->cnf_hdr_len);
+ iso_gen_csum(m0, CLNP_CKSUM_OFF, (int) er->cnf_hdr_len);
/* trim packet if too large for interface */
if (total_len > ifp->if_mtu)
m_adj(m0, -(total_len - ifp->if_mtu));
-
+
/* send packet */
INCSTAT(cns_er_outhist[clnp_er_index(reason)]);
- (void) (*ifp->if_output)(ifp, m0, first_hop, route.ro_rt);
+ (void) (*ifp->if_output) (ifp, m0, first_hop, route.ro_rt);
goto done;
bad:
RTFREE(route.ro_rt);
}
+int
clnp_er_index(p)
-u_char p;
+ u_int p;
{
register u_char *cp = clnp_er_codes + CLNP_ERRORS;
while (cp > clnp_er_codes) {
-/* $NetBSD: clnp_frag.c,v 1.6 1995/03/08 02:16:07 cgd Exp $ */
+/* $OpenBSD: clnp_frag.c,v 1.2 1996/03/04 10:34:50 mickey Exp $ */
+/* $NetBSD: clnp_frag.c,v 1.7 1996/02/13 22:08:21 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
#include <netiso/argo_debug.h>
/* all fragments are hung off this list */
-struct clnp_fragl *clnp_frags = NULL;
-
-struct mbuf *clnp_comp_pdu();
-
+struct clnp_fragl *clnp_frags = NULL;
/*
* FUNCTION: clnp_fragment
*
- * PURPOSE: Fragment a datagram, and send the itty bitty pieces
- * out over an interface.
+ * PURPOSE: Fragment a datagram, and send the itty bitty pieces
+ * out over an interface.
*
- * RETURNS: success - 0
- * failure - unix error code
+ * RETURNS: success - 0
+ * failure - unix error code
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES: If there is an error sending the packet, clnp_discard
- * is called to discard the packet and send an ER. If
- * clnp_fragment was called from clnp_output, then
- * we generated the packet, and should not send an
- * ER -- clnp_emit_er will check for this. Otherwise,
- * the packet was fragmented during forwarding. In this
- * case, we ought to send an ER back.
+ * NOTES: If there is an error sending the packet, clnp_discard
+ * is called to discard the packet and send an ER. If
+ * clnp_fragment was called from clnp_output, then
+ * we generated the packet, and should not send an
+ * ER -- clnp_emit_er will check for this. Otherwise,
+ * the packet was fragmented during forwarding. In this
+ * case, we ought to send an ER back.
*/
+int
clnp_fragment(ifp, m, first_hop, total_len, segoff, flags, rt)
-struct ifnet *ifp; /* ptr to outgoing interface */
-struct mbuf *m; /* ptr to packet */
-struct sockaddr *first_hop; /* ptr to first hop */
-int total_len; /* length of datagram */
-int segoff; /* offset of segpart in hdr */
-int flags; /* flags passed to clnp_output */
-struct rtentry *rt; /* route if direct ether */
+ struct ifnet *ifp; /* ptr to outgoing interface */
+ struct mbuf *m; /* ptr to packet */
+ struct sockaddr *first_hop; /* ptr to first hop */
+ int total_len; /* length of datagram */
+ int segoff; /* offset of segpart in hdr */
+ int flags; /* flags passed to clnp_output */
+ struct rtentry *rt; /* route if direct ether */
{
- struct clnp_fixed *clnp = mtod(m, struct clnp_fixed *);
- int hdr_len = (int)clnp->cnf_hdr_len;
- int frag_size = (SN_MTU(ifp, rt) - hdr_len) & ~7;
+ struct clnp_fixed *clnp = mtod(m, struct clnp_fixed *);
+ int hdr_len = (int) clnp->cnf_hdr_len;
+ int frag_size = (SN_MTU(ifp, rt) - hdr_len) & ~7;
total_len -= hdr_len;
if ((clnp->cnf_type & CNF_SEG_OK) &&
- (total_len >= 8) &&
- (frag_size > 8 || (frag_size == 8 && !(total_len & 7)))) {
-
- struct mbuf *hdr = NULL; /* save copy of clnp hdr */
- struct mbuf *frag_hdr = NULL;
- struct mbuf *frag_data = NULL;
- struct clnp_segment seg_part; /* segmentation header */
- int frag_base;
- int error = 0;
+ (total_len >= 8) &&
+ (frag_size > 8 || (frag_size == 8 && !(total_len & 7)))) {
+ struct mbuf *hdr = NULL; /* save copy of clnp hdr */
+ struct mbuf *frag_hdr = NULL;
+ struct mbuf *frag_data = NULL;
+ struct clnp_segment seg_part; /* segmentation header */
+ int frag_base;
+ int error = 0;
INCSTAT(cns_fragmented);
- (void) bcopy(segoff + mtod(m, caddr_t), (caddr_t)&seg_part,
- sizeof(seg_part));
+ (void) bcopy(segoff + mtod(m, caddr_t), (caddr_t) & seg_part,
+ sizeof(seg_part));
frag_base = ntohs(seg_part.cng_off);
/*
* Duplicate header, and remove from packet
*/
if ((hdr = m_copy(m, 0, hdr_len)) == NULL) {
clnp_discard(m, GEN_CONGEST);
- return(ENOBUFS);
+ return (ENOBUFS);
}
m_adj(m, hdr_len);
while (total_len > 0) {
- int remaining, last_frag;
-
- IFDEBUG(D_FRAG)
- struct mbuf *mdump = frag_hdr;
- int tot_mlen = 0;
- printf("clnp_fragment: total_len %d:\n", total_len);
+ int remaining, last_frag;
+
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_FRAG]) {
+ struct mbuf *mdump = frag_hdr;
+ int tot_mlen = 0;
+ printf("clnp_fragment: total_len %d:\n",
+ total_len);
while (mdump != NULL) {
- printf("\tmbuf x%x, m_len %d\n",
- mdump, mdump->m_len);
+ printf("\tmbuf x%x, m_len %d\n",
+ (unsigned int) mdump,
+ mdump->m_len);
tot_mlen += mdump->m_len;
mdump = mdump->m_next;
}
- printf("clnp_fragment: sum of mbuf chain %d:\n", tot_mlen);
- ENDDEBUG
-
+ printf("clnp_fragment: sum of mbuf chain %d:\n",
+ tot_mlen);
+ }
+#endif
+
frag_size = min(total_len, frag_size);
if ((remaining = total_len - frag_size) == 0)
last_frag = 1;
else {
/*
- * If this fragment will cause the last one to
- * be less than 8 bytes, shorten this fragment a bit.
- * The obscure test on frag_size above ensures that
- * frag_size will be positive.
+ * If this fragment will cause the last one to
+ * be less than 8 bytes, shorten this fragment
+ * a bit. The obscure test on frag_size above
+ * ensures that frag_size will be positive.
*/
last_frag = 0;
if (remaining < 8)
- frag_size -= 8;
+ frag_size -= 8;
}
-
- IFDEBUG(D_FRAG)
- printf("clnp_fragment: seg off %d, size %d, remaining %d\n",
- ntohs(seg_part.cng_off), frag_size, total_len-frag_size);
+
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_FRAG]) {
+ printf(
+ "clnp_fragment: seg off %d, size %d, rem %d\n",
+ ntohs(seg_part.cng_off), frag_size,
+ total_len - frag_size);
if (last_frag)
- printf("clnp_fragment: last fragment\n");
- ENDDEBUG
+ printf(
+ "clnp_fragment: last fragment\n");
+ }
+#endif
if (last_frag) {
- /*
- * this is the last fragment; we don't need to get any other
- * mbufs.
+ /*
+ * this is the last fragment; we don't need
+ * to get any other mbufs.
*/
frag_hdr = hdr;
frag_data = m;
} else {
/* duplicate header and data mbufs */
- if ((frag_hdr = m_copy(hdr, 0, (int)M_COPYALL)) == NULL) {
+ frag_hdr = m_copy(hdr, 0, (int) M_COPYALL);
+ if (frag_hdr == NULL) {
clnp_discard(hdr, GEN_CONGEST);
m_freem(m);
- return(ENOBUFS);
+ return (ENOBUFS);
}
- if ((frag_data = m_copy(m, 0, frag_size)) == NULL) {
+ frag_data = m_copy(m, 0, frag_size);
+ if (frag_data == NULL) {
clnp_discard(hdr, GEN_CONGEST);
m_freem(m);
m_freem(frag_hdr);
- return(ENOBUFS);
+ return (ENOBUFS);
}
INCSTAT(cns_fragments);
}
if (!last_frag)
clnp->cnf_type |= CNF_MORE_SEGS;
-
+
/* link together */
m_cat(frag_hdr, frag_data);
/* insert segmentation part; updated below */
- bcopy((caddr_t)&seg_part, mtod(frag_hdr, caddr_t) + segoff,
- sizeof(struct clnp_segment));
+ bcopy((caddr_t) & seg_part,
+ mtod(frag_hdr, caddr_t) + segoff,
+ sizeof(struct clnp_segment));
{
- int derived_len = hdr_len + frag_size;
- HTOC(clnp->cnf_seglen_msb, clnp->cnf_seglen_lsb, derived_len);
+ int derived_len = hdr_len + frag_size;
+ HTOC(clnp->cnf_seglen_msb,
+ clnp->cnf_seglen_lsb, derived_len);
if ((frag_hdr->m_flags & M_PKTHDR) == 0)
panic("clnp_frag:lost header");
frag_hdr->m_pkthdr.len = derived_len;
}
+
/* compute clnp checksum (on header only) */
if (flags & CLNP_NO_CKSUM) {
- HTOC(clnp->cnf_cksum_msb, clnp->cnf_cksum_lsb, 0);
+ HTOC(clnp->cnf_cksum_msb,
+ clnp->cnf_cksum_lsb, 0);
} else {
iso_gen_csum(frag_hdr, CLNP_CKSUM_OFF, hdr_len);
}
- IFDEBUG(D_DUMPOUT)
- struct mbuf *mdump = frag_hdr;
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_DUMPOUT]) {
+ struct mbuf *mdump = frag_hdr;
printf("clnp_fragment: sending dg:\n");
while (mdump != NULL) {
- printf("\tmbuf x%x, m_len %d\n", mdump, mdump->m_len);
+ printf("\tmbuf x%x, m_len %d\n",
+ (unsigned int) mdump,
+ mdump->m_len);
mdump = mdump->m_next;
}
- ENDDEBUG
+ }
+#endif
#ifdef TROLL
error = troll_output(ifp, frag_hdr, first_hop, rt);
#else
- error = (*ifp->if_output)(ifp, frag_hdr, first_hop, rt);
-#endif /* TROLL */
+ error = (*ifp->if_output) (ifp, frag_hdr, first_hop, rt);
+#endif /* TROLL */
/*
- * Tough situation: if the error occured on the last
- * fragment, we can not send an ER, as the if_output
- * routine consumed the packet. If the error occured
- * on any intermediate packets, we can send an ER
- * because we still have the original header in (m).
+ * Tough situation: if the error occured on the last
+ * fragment, we can not send an ER, as the if_output
+ * routine consumed the packet. If the error occured
+ * on any intermediate packets, we can send an ER
+ * because we still have the original header in (m).
*/
if (error) {
if (frag_hdr != hdr) {
- /*
- * The error was not on the last fragment. We must
- * free hdr and m before returning
+ /*
+ * The error was not on the last
+ * fragment. We must free hdr and m
+ * before returning
*/
clnp_discard(hdr, GEN_NOREAS);
m_freem(m);
}
- return(error);
+ return (error);
}
-
- /* bump segment offset, trim data mbuf, and decrement count left */
+ /*
+ * bump segment offset, trim data mbuf, and decrement
+ * count left
+ */
#ifdef TROLL
/*
- * Decrement frag_size by some fraction. This will cause the
- * next fragment to start 'early', thus duplicating the end
- * of the current fragment. troll.tr_dup_size controls
- * the fraction. If positive, it specifies the fraction. If
- * negative, a random fraction is used.
+ * Decrement frag_size by some fraction. This will
+ * cause the next fragment to start 'early', thus
+ * duplicating the end of the current fragment.
+ * troll.tr_dup_size controls the fraction. If
+ * positive, it specifies the fraction. If
+ * negative, a random fraction is used.
*/
if ((trollctl.tr_ops & TR_DUPEND) && (!last_frag)) {
- int num_bytes = frag_size;
+ int num_bytes = frag_size;
- if (trollctl.tr_dup_size > 0)
+ if (trollctl.tr_dup_size > 0)
num_bytes *= trollctl.tr_dup_size;
else
num_bytes *= troll_random();
frag_size -= num_bytes;
}
-#endif /* TROLL */
+#endif /* TROLL */
total_len -= frag_size;
if (!last_frag) {
frag_base += frag_size;
m_adj(m, frag_size);
}
}
- return(0);
+ return (0);
} else {
- cantfrag:
INCSTAT(cns_cantfrag);
clnp_discard(m, GEN_SEGNEEDED);
- return(EMSGSIZE);
+ return (EMSGSIZE);
}
}
/*
* FUNCTION: clnp_reass
*
- * PURPOSE: Attempt to reassemble a clnp packet given the current
- * fragment. If reassembly succeeds (all the fragments
- * are present), then return a pointer to an mbuf chain
- * containing the reassembled packet. This packet will
- * appear in the mbufs as if it had just arrived in
- * one piece.
+ * PURPOSE: Attempt to reassemble a clnp packet given the current
+ * fragment. If reassembly succeeds (all the fragments
+ * are present), then return a pointer to an mbuf chain
+ * containing the reassembled packet. This packet will
+ * appear in the mbufs as if it had just arrived in
+ * one piece.
*
- * If reassembly fails, then save this fragment and
- * return 0.
+ * If reassembly fails, then save this fragment and
+ * return 0.
*
- * RETURNS: Ptr to assembled packet, or 0
+ * RETURNS: Ptr to assembled packet, or 0
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
- * clnp_slowtimo can not affect this code because clnpintr, and thus
- * this code, is called at a higher priority than clnp_slowtimo.
+ * NOTES: clnp_slowtimo can not affect this code because
+ * clnpintr, and thus this code, is called at a higher
+ * priority than clnp_slowtimo.
*/
-struct mbuf *
+struct mbuf *
clnp_reass(m, src, dst, seg)
-struct mbuf *m; /* new fragment */
-struct iso_addr *src; /* src of new fragment */
-struct iso_addr *dst; /* dst of new fragment */
-struct clnp_segment *seg; /* segment part of fragment header */
+ struct mbuf *m; /* new fragment */
+ struct iso_addr *src; /* src of new fragment */
+ struct iso_addr *dst; /* dst of new fragment */
+ struct clnp_segment *seg; /* segment part of fragment header */
{
- register struct clnp_fragl *cfh;
+ register struct clnp_fragl *cfh;
/* look for other fragments of this datagram */
for (cfh = clnp_frags; cfh != NULL; cfh = cfh->cfl_next) {
if (seg->cng_id == cfh->cfl_id &&
- iso_addrmatch1(src, &cfh->cfl_src) &&
- iso_addrmatch1(dst, &cfh->cfl_dst)) {
- IFDEBUG(D_REASS)
+ iso_addrmatch1(src, &cfh->cfl_src) &&
+ iso_addrmatch1(dst, &cfh->cfl_dst)) {
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_REASS]) {
printf("clnp_reass: found packet\n");
- ENDDEBUG
+ }
+#endif
/*
- * There are other fragments here already. Lets see if
- * this fragment is of any help
+ * There are other fragments here already. Lets see if
+ * this fragment is of any help
*/
clnp_insert_frag(cfh, m, seg);
- if (m = clnp_comp_pdu(cfh)) {
- register struct clnp_fixed *clnp = mtod(m, struct clnp_fixed *);
- HTOC(clnp->cnf_seglen_msb, clnp->cnf_seglen_lsb,
- seg->cng_tot_len);
+ if ((m = clnp_comp_pdu(cfh)) != NULL) {
+ struct clnp_fixed *clnp =
+ mtod(m, struct clnp_fixed *);
+ HTOC(clnp->cnf_seglen_msb,
+ clnp->cnf_seglen_lsb,
+ seg->cng_tot_len);
}
return (m);
}
}
- IFDEBUG(D_REASS)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_REASS]) {
printf("clnp_reass: new packet!\n");
- ENDDEBUG
+ }
+#endif
/*
- * This is the first fragment. If src is not consuming too many
- * resources, then create a new fragment list and add
- * this fragment to the list.
+ * This is the first fragment. If src is not consuming too many
+ * resources, then create a new fragment list and add
+ * this fragment to the list.
*/
/* TODO: don't let one src hog all the reassembly buffers */
- if (!clnp_newpkt(m, src, dst, seg) /* || this src is a hog */) {
+ if (!clnp_newpkt(m, src, dst, seg) /* || this src is a hog */ ) {
INCSTAT(cns_fragdropped);
clnp_discard(m, GEN_CONGEST);
}
-
- return(NULL);
+ return (NULL);
}
/*
* FUNCTION: clnp_newpkt
*
- * PURPOSE: Create the necessary structures to handle a new
- * fragmented clnp packet.
+ * PURPOSE: Create the necessary structures to handle a new
+ * fragmented clnp packet.
*
- * RETURNS: non-zero if it succeeds, zero if fails.
+ * RETURNS: non-zero if it succeeds, zero if fails.
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES: Failure is only due to insufficient resources.
+ * NOTES: Failure is only due to insufficient resources.
*/
+int
clnp_newpkt(m, src, dst, seg)
-struct mbuf *m; /* new fragment */
-struct iso_addr *src; /* src of new fragment */
-struct iso_addr *dst; /* dst of new fragment */
-struct clnp_segment *seg; /* segment part of fragment header */
+ struct mbuf *m; /* new fragment */
+ struct iso_addr *src; /* src of new fragment */
+ struct iso_addr *dst; /* dst of new fragment */
+ struct clnp_segment *seg; /* segment part of fragment header */
{
- register struct clnp_fragl *cfh;
- register struct clnp_fixed *clnp;
- struct mbuf *m0;
-
+ register struct clnp_fragl *cfh;
+ register struct clnp_fixed *clnp;
+ struct mbuf *m0;
+
clnp = mtod(m, struct clnp_fixed *);
- /*
- * Allocate new clnp fragl structure to act as header of all fragments
- * for this datagram.
+ /*
+ * Allocate new clnp fragl structure to act as header of all
+ * fragments for this datagram.
*/
MGET(m0, M_DONTWAIT, MT_FTABLE);
if (m0 == NULL) {
}
cfh = mtod(m0, struct clnp_fragl *);
- /*
- * Duplicate the header of this fragment, and save in cfh.
- * Free m0 and return if m_copy does not succeed.
+ /*
+ * Duplicate the header of this fragment, and save in cfh. Free m0
+ * and return if m_copy does not succeed.
*/
- if ((cfh->cfl_orighdr = m_copy(m, 0, (int)clnp->cnf_hdr_len)) == NULL) {
+ cfh->cfl_orighdr = m_copy(m, 0, (int) clnp->cnf_hdr_len);
+ if (cfh->cfl_orighdr == NULL) {
m_freem(m0);
return (0);
}
-
/* Fill in rest of fragl structure */
- bcopy((caddr_t)src, (caddr_t)&cfh->cfl_src, sizeof(struct iso_addr));
- bcopy((caddr_t)dst, (caddr_t)&cfh->cfl_dst, sizeof(struct iso_addr));
+ bcopy((caddr_t) src, (caddr_t) & cfh->cfl_src, sizeof(struct iso_addr));
+ bcopy((caddr_t) dst, (caddr_t) & cfh->cfl_dst, sizeof(struct iso_addr));
cfh->cfl_id = seg->cng_id;
cfh->cfl_ttl = clnp->cnf_ttl;
cfh->cfl_last = (seg->cng_tot_len - clnp->cnf_hdr_len) - 1;
/* Insert this fragment into list headed by cfh */
clnp_insert_frag(cfh, m, seg);
- return(1);
+ return (1);
}
/*
* FUNCTION: clnp_insert_frag
*
- * PURPOSE: Insert fragment into list headed by 'cf'.
+ * PURPOSE: Insert fragment into list headed by 'cf'.
*
- * RETURNS: nothing
+ * RETURNS: nothing
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES: This is the 'guts' of the reassembly algorithm.
- * Each fragment in this list contains a clnp_frag
- * structure followed by the data of the fragment.
- * The clnp_frag structure actually lies on top of
- * part of the old clnp header.
+ * NOTES: This is the 'guts' of the reassembly algorithm.
+ * Each fragment in this list contains a clnp_frag
+ * structure followed by the data of the fragment.
+ * The clnp_frag structure actually lies on top of
+ * part of the old clnp header.
*/
+void
clnp_insert_frag(cfh, m, seg)
-struct clnp_fragl *cfh; /* header of list of packet fragments */
-struct mbuf *m; /* new fragment */
-struct clnp_segment *seg; /* segment part of fragment header */
+ struct clnp_fragl *cfh; /* header of list of packet fragments */
+ struct mbuf *m; /* new fragment */
+ struct clnp_segment *seg; /* segment part of fragment header */
{
- register struct clnp_fixed *clnp; /* clnp hdr of fragment */
- register struct clnp_frag *cf; /* generic fragment ptr */
- register struct clnp_frag *cf_sub = NULL; /* frag subsequent to new one */
- register struct clnp_frag *cf_prev = NULL; /* frag previous to new one */
- u_short first; /* offset of first byte of initial pdu*/
- u_short last; /* offset of last byte of initial pdu */
- u_short fraglen;/* length of fragment */
-
+ register struct clnp_fixed *clnp; /* clnp hdr of fragment */
+ register struct clnp_frag *cf; /* generic fragment ptr */
+ register struct clnp_frag *cf_sub = NULL; /* frag subseq to new
+ * one */
+ register struct clnp_frag *cf_prev = NULL; /* frag prev to new one */
+ u_short first; /* offset of first byte of initial pdu */
+ u_short last; /* offset of last byte of initial pdu */
+ u_short fraglen;/* length of fragment */
+
clnp = mtod(m, struct clnp_fixed *);
first = seg->cng_off;
CTOH(clnp->cnf_seglen_msb, clnp->cnf_seglen_lsb, fraglen);
fraglen -= clnp->cnf_hdr_len;
last = (first + fraglen) - 1;
- IFDEBUG(D_REASS)
- printf("clnp_insert_frag: New fragment: [%d ... %d], len %d\n",
- first, last, fraglen);
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_REASS]) {
+ printf("clnp_insert_frag: New fragment: [%d-%d], len %d\n",
+ first, last, fraglen);
printf("clnp_insert_frag: current fragments:\n");
for (cf = cfh->cfl_frags; cf != NULL; cf = cf->cfr_next) {
- printf("\tcf x%x: [%d ... %d]\n", cf, cf->cfr_first, cf->cfr_last);
+ printf("\tcf x%x: [%d-%d]\n",
+ (unsigned int) cf, cf->cfr_first, cf->cfr_last);
}
- ENDDEBUG
+ }
+#endif
if (cfh->cfl_frags != NULL) {
/*
- * Find fragment which begins after the new one
+ * Find fragment which begins after the new one
*/
- for (cf = cfh->cfl_frags; cf != NULL; cf_prev = cf, cf = cf->cfr_next) {
+ for (cf = cfh->cfl_frags; cf != NULL;
+ cf_prev = cf, cf = cf->cfr_next) {
if (cf->cfr_first > first) {
cf_sub = cf;
break;
}
}
- IFDEBUG(D_REASS)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_REASS]) {
printf("clnp_insert_frag: Previous frag is ");
if (cf_prev == NULL)
printf("NULL\n");
- else
- printf("[%d ... %d]\n", cf_prev->cfr_first, cf_prev->cfr_last);
+ else
+ printf("[%d-%d]\n", cf_prev->cfr_first,
+ cf_prev->cfr_last);
printf("clnp_insert_frag: Subsequent frag is ");
if (cf_sub == NULL)
printf("NULL\n");
- else
- printf("[%d ... %d]\n", cf_sub->cfr_first, cf_sub->cfr_last);
- ENDDEBUG
+ else
+ printf("[%d-%d]\n", cf_sub->cfr_first,
+ cf_sub->cfr_last);
+ }
+#endif
/*
- * If there is a fragment before the new one, check if it
- * overlaps the new one. If so, then trim the end of the
- * previous one.
+ * If there is a fragment before the new one, check if it
+ * overlaps the new one. If so, then trim the end of the
+ * previous one.
*/
if (cf_prev != NULL) {
if (cf_prev->cfr_last > first) {
- u_short overlap = cf_prev->cfr_last - first;
+ u_short overlap = cf_prev->cfr_last - first;
- IFDEBUG(D_REASS)
- printf("clnp_insert_frag: previous overlaps by %d\n",
- overlap);
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_REASS]) {
+ printf(
+ "clnp_insert_frag: previous overlaps by %d\n",
+ overlap);
+ }
+#endif
if (overlap > fraglen) {
/*
- * The new fragment is entirely contained in the
- * preceeding one. We can punt on the new frag
- * completely.
+ * The new fragment is entirely
+ * contained in the preceeding one.
+ * We can punt on the new frag
+ * completely.
*/
m_freem(m);
return;
} else {
- /* Trim data off of end of previous fragment */
- /* inc overlap to prevent duplication of last byte */
+ /*
+ * Trim data off of end of previous
+ * fragment
+ */
+ /*
+ * inc overlap to prevent duplication
+ * of last byte
+ */
overlap++;
- m_adj(cf_prev->cfr_data, -(int)overlap);
+ m_adj(cf_prev->cfr_data, -(int) overlap);
cf_prev->cfr_last -= overlap;
}
}
}
-
/*
* For all fragments past the new one, check if any data on
* the new one overlaps data on existing fragments. If so,
*/
for (cf = cf_sub; cf != NULL; cf = cf->cfr_next) {
if (cf->cfr_first < last) {
- u_short overlap = last - cf->cfr_first;
+ u_short overlap = last - cf->cfr_first;
- IFDEBUG(D_REASS)
- printf("clnp_insert_frag: subsequent overlaps by %d\n",
- overlap);
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_REASS]) {
+ printf(
+ "clnp_insert_frag: subsequent overlaps by %d\n",
+ overlap);
+ }
+#endif
if (overlap > fraglen) {
/*
- * The new fragment is entirely contained in the
- * succeeding one. This should not happen, because
- * early on in this code we scanned for the fragment
- * which started after the new one!
+ * The new fragment is entirely
+ * contained in the succeeding one.
+ * This should not happen, because
+ * early on in this code we scanned
+ * for the fragment which started
+ * after the new one!
*/
m_freem(m);
- printf("clnp_insert_frag: internal error!\n");
+ printf(
+ "clnp_insert_frag: internal error!\n");
return;
} else {
- /* Trim data off of end of new fragment */
- /* inc overlap to prevent duplication of last byte */
+ /*
+ * Trim data off of end of new fragment
+ * inc overlap to prevent duplication
+ * of last byte
+ */
overlap++;
- m_adj(m, -(int)overlap);
+ m_adj(m, -(int) overlap);
last -= overlap;
}
}
}
}
-
/*
- * Insert the new fragment beween cf_prev and cf_sub
+ * Insert the new fragment beween cf_prev and cf_sub
*
- * Note: the clnp hdr is still in the mbuf.
- * If the data of the mbuf is not word aligned, shave off enough
- * so that it is. Then, cast the clnp_frag structure on top
- * of the clnp header.
- * The clnp_hdr will not be used again (as we already have
- * saved a copy of it).
+ * Note: the clnp hdr is still in the mbuf.
+ * If the data of the mbuf is not word aligned, shave off enough
+ * so that it is. Then, cast the clnp_frag structure on top
+ * of the clnp header.
+ * The clnp_hdr will not be used again (as we already have
+ * saved a copy of it).
*
- * Save in cfr_bytes the number of bytes to shave off to get to
- * the data of the packet. This is used when we coalesce fragments;
- * the clnp_frag structure must be removed before joining mbufs.
+ * Save in cfr_bytes the number of bytes to shave off to get to
+ * the data of the packet. This is used when we coalesce fragments;
+ * the clnp_frag structure must be removed before joining mbufs.
*/
{
- int pad;
- u_int bytes;
+ int pad;
+ u_int bytes;
/* determine if header is not word aligned */
- pad = (long)clnp % 4;
+ pad = (long) clnp % 4;
if (pad < 0)
pad = -pad;
/* bytes is number of bytes left in front of data */
bytes = clnp->cnf_hdr_len - pad;
- IFDEBUG(D_REASS)
- printf("clnp_insert_frag: clnp x%x requires %d alignment\n",
- clnp, pad);
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_REASS]) {
+ printf(
+ "clnp_insert_frag: clnp x%x requires %d alignment\n",
+ (unsigned int) clnp, pad);
+ }
+#endif
/* make it word aligned if necessary */
if (pad)
cf = mtod(m, struct clnp_frag *);
cf->cfr_bytes = bytes;
- IFDEBUG(D_REASS)
- printf("clnp_insert_frag: cf now x%x, cfr_bytes %d\n", cf,
- cf->cfr_bytes);
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_REASS]) {
+ printf("clnp_insert_frag: cf now x%x, cfr_bytes %d\n",
+ (unsigned int) cf, cf->cfr_bytes);
+ }
+#endif
}
cf->cfr_first = first;
cf->cfr_last = last;
/*
- * The data is the mbuf itself, although we must remember that the
- * first few bytes are actually a clnp_frag structure
+ * The data is the mbuf itself, although we must remember that the
+ * first few bytes are actually a clnp_frag structure
*/
cf->cfr_data = m;
/*
* FUNCTION: clnp_comp_pdu
*
- * PURPOSE: Scan the list of fragments headed by cfh. Merge
- * any contigious fragments into one. If, after
- * traversing all the fragments, it is determined that
- * the packet is complete, then return a pointer to
- * the packet (with header prepended). Otherwise,
- * return NULL.
+ * PURPOSE: Scan the list of fragments headed by cfh. Merge
+ * any contigious fragments into one. If, after
+ * traversing all the fragments, it is determined that
+ * the packet is complete, then return a pointer to
+ * the packet (with header prepended). Otherwise,
+ * return NULL.
*
- * RETURNS: NULL, or a pointer to the assembled pdu in an mbuf chain.
+ * RETURNS: NULL, or a pointer to the assembled pdu in an mbuf
+ * chain.
*
* SIDE EFFECTS: Will colapse contigious fragments into one.
*
- * NOTES: This code assumes that there are no overlaps of
- * fragment pdus.
+ * NOTES: This code assumes that there are no overlaps of
+ * fragment pdus.
*/
-struct mbuf *
+struct mbuf *
clnp_comp_pdu(cfh)
-struct clnp_fragl *cfh; /* fragment header */
+ struct clnp_fragl *cfh; /* fragment header */
{
- register struct clnp_frag *cf = cfh->cfl_frags;
+ register struct clnp_frag *cf = cfh->cfl_frags;
while (cf->cfr_next != NULL) {
- register struct clnp_frag *cf_next = cf->cfr_next;
+ register struct clnp_frag *cf_next = cf->cfr_next;
- IFDEBUG(D_REASS)
- printf("clnp_comp_pdu: comparing: [%d ... %d] to [%d ... %d]\n",
- cf->cfr_first, cf->cfr_last, cf_next->cfr_first,
- cf_next->cfr_last);
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_REASS]) {
+ printf("clnp_comp_pdu: comparing: [%d-%d] to [%d-%d]\n",
+ cf->cfr_first, cf->cfr_last, cf_next->cfr_first,
+ cf_next->cfr_last);
+ }
+#endif
if (cf->cfr_last == (cf_next->cfr_first - 1)) {
/*
- * Merge fragment cf and cf_next
+ * Merge fragment cf and cf_next
*
- * - update cf header
- * - trim clnp_frag structure off of cf_next
- * - append cf_next to cf
+ * - update cf header
+ * - trim clnp_frag structure off of cf_next
+ * - append cf_next to cf
*/
- struct clnp_frag cf_next_hdr;
- struct clnp_frag *next_frag;
+ struct clnp_frag cf_next_hdr;
+ struct clnp_frag *next_frag;
cf_next_hdr = *cf_next;
next_frag = cf_next->cfr_next;
- IFDEBUG(D_REASS)
- struct mbuf *mdump;
- int l;
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_REASS]) {
+ struct mbuf *mdump;
+ int l;
printf("clnp_comp_pdu: merging fragments\n");
- printf("clnp_comp_pdu: 1st: [%d ... %d] (bytes %d)\n",
- cf->cfr_first, cf->cfr_last, cf->cfr_bytes);
+ printf(
+ "clnp_comp_pdu: 1st: [%d-%d] (bytes %d)\n",
+ cf->cfr_first, cf->cfr_last,
+ cf->cfr_bytes);
mdump = cf->cfr_data;
l = 0;
while (mdump != NULL) {
- printf("\tmbuf x%x, m_len %d\n", mdump, mdump->m_len);
+ printf("\tmbuf x%x, m_len %d\n",
+ (unsigned int) mdump,
+ mdump->m_len);
l += mdump->m_len;
mdump = mdump->m_next;
}
printf("\ttotal len: %d\n", l);
- printf("clnp_comp_pdu: 2nd: [%d ... %d] (bytes %d)\n",
- cf_next->cfr_first, cf_next->cfr_last, cf_next->cfr_bytes);
+ printf(
+ "clnp_comp_pdu: 2nd: [%d-%d] (bytes %d)\n",
+ cf_next->cfr_first, cf_next->cfr_last,
+ cf_next->cfr_bytes);
mdump = cf_next->cfr_data;
l = 0;
while (mdump != NULL) {
- printf("\tmbuf x%x, m_len %d\n", mdump, mdump->m_len);
+ printf("\tmbuf x%x, m_len %d\n",
+ (unsigned int) mdump,
+ mdump->m_len);
l += mdump->m_len;
mdump = mdump->m_next;
}
printf("\ttotal len: %d\n", l);
- ENDDEBUG
+ }
+#endif
cf->cfr_last = cf_next->cfr_last;
/*
- * After this m_adj, the cf_next ptr is useless because we
- * have adjusted the clnp_frag structure away...
+ * After this m_adj, the cf_next ptr is useless
+ * because we have adjusted the clnp_frag structure
+ * away...
*/
- IFDEBUG(D_REASS)
- printf("clnp_comp_pdu: shaving off %d bytes\n",
- cf_next_hdr.cfr_bytes);
- ENDDEBUG
- m_adj(cf_next_hdr.cfr_data, (int)cf_next_hdr.cfr_bytes);
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_REASS]) {
+ printf("clnp_comp_pdu: shaving off %d bytes\n",
+ cf_next_hdr.cfr_bytes);
+ }
+#endif
+ m_adj(cf_next_hdr.cfr_data,
+ (int) cf_next_hdr.cfr_bytes);
m_cat(cf->cfr_data, cf_next_hdr.cfr_data);
cf->cfr_next = next_frag;
} else {
cf = cfh->cfl_frags;
- IFDEBUG(D_REASS)
- struct mbuf *mdump = cf->cfr_data;
- printf("clnp_comp_pdu: first frag now: [%d ... %d]\n", cf->cfr_first,
- cf->cfr_last);
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_REASS]) {
+ struct mbuf *mdump = cf->cfr_data;
+ printf("clnp_comp_pdu: first frag now: [%d-%d]\n",
+ cf->cfr_first, cf->cfr_last);
printf("clnp_comp_pdu: data for frag:\n");
while (mdump != NULL) {
- printf("mbuf x%x, m_len %d\n", mdump, mdump->m_len);
-/* dump_buf(mtod(mdump, caddr_t), mdump->m_len);*/
+ printf("mbuf x%x, m_len %d\n", (unsigned int) mdump,
+ mdump->m_len);
+ /* dump_buf(mtod(mdump, caddr_t), mdump->m_len); */
mdump = mdump->m_next;
}
- ENDDEBUG
+ }
+#endif
/* Check if datagram is complete */
if ((cf->cfr_first == 0) && (cf->cfr_last == cfh->cfl_last)) {
/*
- * We have a complete pdu!
- * - Remove the frag header from (only) remaining fragment
- * (which is not really a fragment anymore, as the datagram is
- * complete).
- * - Prepend a clnp header
+ * We have a complete pdu!
+ * - Remove the frag header from (only) remaining fragment
+ * (which is not really a fragment anymore, as the datagram
+ * is complete).
+ * - Prepend a clnp header
*/
- struct mbuf *data = cf->cfr_data;
- struct mbuf *hdr = cfh->cfl_orighdr;
+ struct mbuf *data = cf->cfr_data;
+ struct mbuf *hdr = cfh->cfl_orighdr;
struct clnp_fragl *scan;
- IFDEBUG(D_REASS)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_REASS]) {
printf("clnp_comp_pdu: complete pdu!\n");
- ENDDEBUG
+ }
+#endif
- m_adj(data, (int)cf->cfr_bytes);
+ m_adj(data, (int) cf->cfr_bytes);
m_cat(hdr, data);
- IFDEBUG(D_DUMPIN)
- struct mbuf *mdump = hdr;
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_DUMPIN]) {
+ struct mbuf *mdump = hdr;
printf("clnp_comp_pdu: pdu is:\n");
while (mdump != NULL) {
- printf("mbuf x%x, m_len %d\n", mdump, mdump->m_len);
-/* dump_buf(mtod(mdump, caddr_t), mdump->m_len);*/
+ printf("mbuf x%x, m_len %d\n",
+ (unsigned int) mdump,
+ mdump->m_len);
+#if 0
+ dump_buf(mtod(mdump, caddr_t), mdump->m_len);
+#endif
mdump = mdump->m_next;
}
- ENDDEBUG
+ }
+#endif
/*
- * Remove cfh from the list of fragmented pdus
+ * Remove cfh from the list of fragmented pdus
*/
if (clnp_frags == cfh) {
clnp_frags = cfh->cfl_next;
} else {
- for (scan = clnp_frags; scan != NULL; scan = scan->cfl_next) {
+ for (scan = clnp_frags; scan != NULL;
+ scan = scan->cfl_next) {
if (scan->cfl_next == cfh) {
scan->cfl_next = cfh->cfl_next;
break;
/* free cfh */
m_freem(dtom(cfh));
- return(hdr);
+ return (hdr);
}
-
- return(NULL);
+ return (NULL);
}
#ifdef TROLL
-static int troll_cnt;
+static int troll_cnt;
#include <sys/time.h>
/*
* FUNCTION: troll_random
*
- * PURPOSE: generate a pseudo-random number between 0 and 1
+ * PURPOSE: generate a pseudo-random number between 0 and 1
*
- * RETURNS: the random number
+ * RETURNS: the random number
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES: This is based on the clock.
+ * NOTES: This is based on the clock.
*/
-float troll_random()
+float
+troll_random()
{
extern struct timeval time;
- long t = time.tv_usec % 100;
+ long t = time.tv_usec % 100;
- return((float)t / (float) 100);
+ return ((float) t / (float) 100);
}
/*
* FUNCTION: troll_output
*
- * PURPOSE: Do something sneaky with the datagram passed. Possible
- * operations are:
- * Duplicate the packet
- * Drop the packet
- * Trim some number of bytes from the packet
- * Munge some byte in the packet
+ * PURPOSE: Do something sneaky with the datagram passed. Possible
+ * operations are:
+ * Duplicate the packet
+ * Drop the packet
+ * Trim some number of bytes from the packet
+ * Munge some byte in the packet
*
- * RETURNS: 0, or unix error code
+ * RETURNS: 0, or unix error code
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES: The operation of this procedure is regulated by the
- * troll control structure (Troll).
+ * NOTES: The operation of this procedure is regulated by the
+ * troll control structure (Troll).
*/
+int
troll_output(ifp, m, dst, rt)
-struct ifnet *ifp;
-struct mbuf *m;
-struct sockaddr *dst;
-struct rtentry *rt;
+ struct ifnet *ifp;
+ struct mbuf *m;
+ struct sockaddr *dst;
+ struct rtentry *rt;
{
- int err = 0;
+ int err = 0;
troll_cnt++;
if (trollctl.tr_ops & TR_DUPPKT) {
* Duplicate every Nth packet
* TODO: random?
*/
- float f_freq = troll_cnt * trollctl.tr_dup_freq;
- int i_freq = troll_cnt * trollctl.tr_dup_freq;
+ float f_freq = troll_cnt * trollctl.tr_dup_freq;
+ int i_freq = troll_cnt * trollctl.tr_dup_freq;
if (i_freq == f_freq) {
- struct mbuf *dup = m_copy(m, 0, (int)M_COPYALL);
+ struct mbuf *dup = m_copy(m, 0, (int) M_COPYALL);
if (dup != NULL)
- err = (*ifp->if_output)(ifp, dup, dst, rt);
+ err = (*ifp->if_output) (ifp, dup, dst, rt);
}
if (!err)
- err = (*ifp->if_output)(ifp, m, dst, rt);
- return(err);
+ err = (*ifp->if_output) (ifp, m, dst, rt);
+ return (err);
} else if (trollctl.tr_ops & TR_DROPPKT) {
} else if (trollctl.tr_ops & TR_CHANGE) {
struct clnp_fixed *clnp = mtod(m, struct clnp_fixed *);
clnp->cnf_cksum_msb = 0;
- err = (*ifp->if_output)(ifp, m, dst, rt);
- return(err);
+ err = (*ifp->if_output) (ifp, m, dst, rt);
+ return (err);
} else {
- err = (*ifp->if_output)(ifp, m, dst, rt);
- return(err);
+ err = (*ifp->if_output) (ifp, m, dst, rt);
+ return (err);
}
}
-#endif /* TROLL */
+#endif /* TROLL */
-/* $NetBSD: clnp_input.c,v 1.10 1995/07/27 20:36:14 mycroft Exp $ */
+/* $OpenBSD: clnp_input.c,v 1.2 1996/03/04 10:34:53 mickey Exp $ */
+/* $NetBSD: clnp_input.c,v 1.11 1996/02/13 22:08:26 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
#include <sys/socketvar.h>
#include <sys/errno.h>
#include <sys/time.h>
+#include <sys/systm.h>
#include <net/if.h>
#include <net/if_types.h>
#include <netiso/clnp_stat.h>
#include <netiso/argo_debug.h>
+#include <machine/stdarg.h>
+
#ifdef ISO
-u_char clnp_protox[ISOPROTO_MAX];
+u_char clnp_protox[ISOPROTO_MAX];
struct clnl_protosw clnl_protox[256];
-int clnpqmaxlen = IFQ_MAXLEN; /* RAH? why is this a variable */
-struct mbuf *clnp_data_ck();
-
-void clnp_input(), esis_input();
+int clnpqmaxlen = IFQ_MAXLEN; /* RAH? why is this a
+ * variable */
#ifdef ISO_X25ESIS
-void x25esis_input();
-#endif /* ISO_X25ESIS */
+#if 0
+void x25esis_input();
+#endif
+#endif /* ISO_X25ESIS */
/*
* FUNCTION: clnp_init
*
- * PURPOSE: clnp initialization. Fill in clnp switch tables.
+ * PURPOSE: clnp initialization. Fill in clnp switch tables.
*
- * RETURNS: none
+ * RETURNS: none
*
* SIDE EFFECTS: fills in clnp_protox table with correct offsets into
- * the isosw table.
+ * the isosw table.
*
- * NOTES:
+ * NOTES:
*/
void
clnp_init()
register struct protosw *pr;
/*
- * CLNP protox initialization
+ * CLNP protox initialization
*/
if ((pr = pffindproto(PF_ISO, ISOPROTO_RAW, SOCK_RAW)) == 0)
printf("clnl_init: no raw CLNP\n");
/*
* FUNCTION: clnlintr
*
- * PURPOSE: Process a packet on the clnl input queue
+ * PURPOSE: Process a packet on the clnl input queue
*
- * RETURNS: nothing.
+ * RETURNS: nothing.
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
*/
+void
clnlintr()
{
- register struct mbuf *m; /* ptr to first mbuf of pkt */
- register struct clnl_fixed *clnl; /* ptr to fixed part of clnl hdr */
- int s; /* save and restore priority */
- struct clnl_protosw *clnlsw;/* ptr to protocol switch */
- struct snpa_hdr sh; /* subnetwork hdr */
+ register struct mbuf *m;/* ptr to first mbuf of pkt */
+ register struct clnl_fixed *clnl; /* ptr to fixed part of clnl
+ * hdr */
+ int s; /* save and restore priority */
+ struct clnl_protosw *clnlsw; /* ptr to protocol switch */
+ struct snpa_hdr sh; /* subnetwork hdr */
/*
* Get next datagram off clnl input queue
*/
next:
s = splimp();
- /* IF_DEQUEUESNPAHDR(&clnlintrq, m, sh);*/
+ /* IF_DEQUEUESNPAHDR(&clnlintrq, m, sh); */
IF_DEQUEUE(&clnlintrq, m);
splx(s);
} else {
register struct ifaddr *ifa;
for (ifa = m->m_pkthdr.rcvif->if_addrlist.tqh_first; ifa != 0;
- ifa = ifa->ifa_list.tqe_next)
+ ifa = ifa->ifa_list.tqe_next)
if (ifa->ifa_addr->sa_family == AF_ISO)
break;
if (ifa == 0) {
goto next;
}
}
- bzero((caddr_t)&sh, sizeof(sh));
- sh.snh_flags = m->m_flags & (M_MCAST|M_BCAST);
- switch((sh.snh_ifp = m->m_pkthdr.rcvif)->if_type) {
- extern int ether_output();
+ bzero((caddr_t) & sh, sizeof(sh));
+ sh.snh_flags = m->m_flags & (M_MCAST | M_BCAST);
+ switch ((sh.snh_ifp = m->m_pkthdr.rcvif)->if_type) {
case IFT_EON:
- bcopy(mtod(m, caddr_t), (caddr_t)sh.snh_dhost, sizeof(u_long));
+ bcopy(mtod(m, caddr_t), (caddr_t) sh.snh_dhost, sizeof(u_long));
bcopy(sizeof(u_long) + mtod(m, caddr_t),
- (caddr_t)sh.snh_shost, sizeof(u_long));
+ (caddr_t) sh.snh_shost, sizeof(u_long));
sh.snh_dhost[4] = mtod(m, u_char *)[sizeof(struct ip) +
- _offsetof(struct eon_hdr, eonh_class)];
+ _offsetof(struct eon_hdr, eonh_class)];
m->m_data += EONIPLEN;
m->m_len -= EONIPLEN;
m->m_pkthdr.len -= EONIPLEN;
default:
if (sh.snh_ifp->if_output == ether_output) {
- bcopy((caddr_t)(mtod(m, struct ether_header *)->ether_dhost),
- (caddr_t)sh.snh_dhost, 2*sizeof(sh.snh_dhost));
- m->m_data += sizeof (struct ether_header);
- m->m_len -= sizeof (struct ether_header);
- m->m_pkthdr.len -= sizeof (struct ether_header);
+ bcopy((caddr_t) (mtod(m, struct ether_header *)->ether_dhost),
+ (caddr_t) sh.snh_dhost, 2 * sizeof(sh.snh_dhost));
+ m->m_data += sizeof(struct ether_header);
+ m->m_len -= sizeof(struct ether_header);
+ m->m_pkthdr.len -= sizeof(struct ether_header);
}
}
- IFDEBUG(D_INPUT)
- int i;
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_INPUT]) {
+ int i;
printf("clnlintr: src:");
- for (i=0; i<6; i++)
- printf("%x%c", sh.snh_shost[i] & 0xff, (i<5) ? ':' : ' ');
+ for (i = 0; i < 6; i++)
+ printf("%x%c", sh.snh_shost[i] & 0xff,
+ (i < 5) ? ':' : ' ');
printf(" dst:");
- for (i=0; i<6; i++)
- printf("%x%c", sh.snh_dhost[i] & 0xff, (i<5) ? ':' : ' ');
+ for (i = 0; i < 6; i++)
+ printf("%x%c", sh.snh_dhost[i] & 0xff,
+ (i < 5) ? ':' : ' ');
printf("\n");
- ENDDEBUG
+ }
+#endif
/*
- * Get the fixed part of the clnl header into the first mbuf.
- * Drop the packet if this fails.
- * Do not call m_pullup if we have a cluster mbuf or the
- * data is not there.
+ * Get the fixed part of the clnl header into the first mbuf.
+ * Drop the packet if this fails.
+ * Do not call m_pullup if we have a cluster mbuf or the
+ * data is not there.
*/
if ((IS_CLUSTER(m) || (m->m_len < sizeof(struct clnl_fixed))) &&
- ((m = m_pullup(m, sizeof(struct clnl_fixed))) == 0)) {
+ ((m = m_pullup(m, sizeof(struct clnl_fixed))) == 0)) {
INCSTAT(cns_toosmall); /* TODO: use clnl stats */
- goto next; /* m_pullup discards mbuf */
+ goto next; /* m_pullup discards mbuf */
}
-
clnl = mtod(m, struct clnl_fixed *);
/*
- * Drop packet if the length of the header is not reasonable.
+ * Drop packet if the length of the header is not reasonable.
*/
- if ((clnl->cnf_hdr_len < CLNP_HDR_MIN) ||
- (clnl->cnf_hdr_len > CLNP_HDR_MAX)) {
+ if ((clnl->cnf_hdr_len < CLNP_HDR_MIN) ||
+ (clnl->cnf_hdr_len > CLNP_HDR_MAX)) {
INCSTAT(cns_badhlen); /* TODO: use clnl stats */
m_freem(m);
goto next;
}
-
/*
* If the header is not contained in this mbuf, make it so.
* Drop packet if this fails.
* Note: m_pullup will allocate a cluster mbuf if necessary
*/
if (clnl->cnf_hdr_len > m->m_len) {
- if ((m = m_pullup(m, (int)clnl->cnf_hdr_len)) == 0) {
+ if ((m = m_pullup(m, (int) clnl->cnf_hdr_len)) == 0) {
INCSTAT(cns_badhlen); /* TODO: use clnl stats */
goto next; /* m_pullup discards mbuf */
}
clnl = mtod(m, struct clnl_fixed *);
}
-
clnlsw = &clnl_protox[clnl->cnf_proto_id];
/*
* FUNCTION: clnp_input
*
- * PURPOSE: process an incoming clnp packet
+ * PURPOSE: process an incoming clnp packet
*
- * RETURNS: nothing
+ * RETURNS: nothing
*
* SIDE EFFECTS: increments fields of clnp_stat structure.
- *
+ *
* NOTES:
- * TODO: I would like to make seg_part a pointer into the mbuf, but
+ * TODO: I would like to make seg_part a pointer into the mbuf, but
* will it be correctly aligned?
*/
void
-clnp_input(m, shp)
-struct mbuf *m; /* ptr to first mbuf of pkt */
-struct snpa_hdr *shp; /* subnetwork header */
+#if __STDC__
+clnp_input(struct mbuf *m, ...)
+#else
+clnp_input(m, va_alist)
+ struct mbuf *m; /* ptr to first mbuf of pkt */
+ va_dcl
+#endif
{
- register struct clnp_fixed *clnp; /* ptr to fixed part of header */
- struct sockaddr_iso source; /* source address of pkt */
- struct sockaddr_iso target; /* destination address of pkt */
+ struct snpa_hdr *shp; /* subnetwork header */
+ register struct clnp_fixed *clnp; /* ptr to fixed part of
+ * header */
+ struct sockaddr_iso source; /* source address of pkt */
+ struct sockaddr_iso target; /* destination address of pkt */
#define src source.siso_addr
#define dst target.siso_addr
- caddr_t hoff; /* current offset in packet */
- caddr_t hend; /* address of end of header info */
- struct clnp_segment seg_part; /* segment part of hdr */
- int seg_off=0; /* offset of segment part of hdr */
- int seg_len;/* length of packet data&hdr in bytes */
- struct clnp_optidx oidx, *oidxp = NULL; /* option index */
- extern int iso_systype; /* used by ESIS config resp */
- extern struct sockaddr_iso blank_siso; /* used for initializing */
- int need_afrin = 0;
- /* true if congestion experienced */
- /* which means you need afrin nose */
- /* spray. How clever! */
-
- IFDEBUG(D_INPUT)
+ caddr_t hoff; /* current offset in packet */
+ caddr_t hend; /* address of end of header info */
+ struct clnp_segment seg_part; /* segment part of hdr */
+ int seg_off = 0; /* offset of segment part of hdr */
+ int seg_len;/* length of packet data&hdr in bytes */
+ struct clnp_optidx oidx, *oidxp = NULL; /* option index */
+ extern int iso_systype; /* used by ESIS config resp */
+ extern struct sockaddr_iso blank_siso; /* used for initializing */
+ int need_afrin = 0;
+ /* true if congestion experienced */
+ /* which means you need afrin nose */
+ /* spray. How clever! */
+ va_list ap;
+
+ va_start(ap, m);
+ shp = va_arg(ap, struct snpa_hdr *);
+ va_end(ap);
+
+
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_INPUT]) {
printf(
- "clnp_input: proccessing dg; First mbuf m_len %d, m_type x%x, %s\n",
- m->m_len, m->m_type, IS_CLUSTER(m) ? "cluster" : "normal");
- ENDDEBUG
+ "clnp_input: proccessing dg; First mbuf m_len %d, m_type x%x, %s\n",
+ m->m_len, m->m_type, IS_CLUSTER(m) ? "cluster" : "normal");
+ }
+#endif
need_afrin = 0;
/*
clnp_discard(m, ADDR_DESTUNREACH);
return;
}
-
INCSTAT(cns_total);
clnp = mtod(m, struct clnp_fixed *);
- IFDEBUG(D_DUMPIN)
- struct mbuf *mhead;
- int total_len = 0;
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_DUMPIN]) {
+ struct mbuf *mhead;
+ int total_len = 0;
printf("clnp_input: clnp header:\n");
dump_buf(mtod(m, caddr_t), clnp->cnf_hdr_len);
printf("clnp_input: mbuf chain:\n");
- for (mhead = m; mhead != NULL; mhead=mhead->m_next) {
- printf("m x%x, len %d\n", mhead, mhead->m_len);
+ for (mhead = m; mhead != NULL; mhead = mhead->m_next) {
+ printf("m x%x, len %d\n", (unsigned int) mhead,
+ mhead->m_len);
total_len += mhead->m_len;
}
- printf("clnp_input: total length of mbuf chain %d:\n", total_len);
- ENDDEBUG
+ printf("clnp_input: total length of mbuf chain %d:\n",
+ total_len);
+ }
+#endif
/*
* Compute checksum (if necessary) and drop packet if
* checksum does not match
*/
- if (CKSUM_REQUIRED(clnp) && iso_check_csum(m, (int)clnp->cnf_hdr_len)) {
+ if (CKSUM_REQUIRED(clnp) &&
+ iso_check_csum(m, (int) clnp->cnf_hdr_len)) {
INCSTAT(cns_badcsum);
clnp_discard(m, GEN_BADCSUM);
return;
}
-
if (clnp->cnf_vers != ISO8473_V1) {
INCSTAT(cns_badvers);
clnp_discard(m, DISC_UNSUPPVERS);
return;
}
-
-
- /* check mbuf data length: clnp_data_ck will free mbuf upon error */
+ /* check mbuf data length: clnp_data_ck will free mbuf upon error */
CTOH(clnp->cnf_seglen_msb, clnp->cnf_seglen_lsb, seg_len);
if ((m = clnp_data_ck(m, seg_len)) == 0)
return;
-
+
clnp = mtod(m, struct clnp_fixed *);
- hend = (caddr_t)clnp + clnp->cnf_hdr_len;
+ hend = (caddr_t) clnp + clnp->cnf_hdr_len;
- /*
- * extract the source and destination address
- * drop packet on failure
+ /*
+ * extract the source and destination address drop packet on failure
*/
source = target = blank_siso;
- hoff = (caddr_t)clnp + sizeof(struct clnp_fixed);
+ hoff = (caddr_t) clnp + sizeof(struct clnp_fixed);
CLNP_EXTRACT_ADDR(dst, hoff, hend);
- if (hoff == (caddr_t)0) {
+ if (hoff == (caddr_t) 0) {
INCSTAT(cns_badaddr);
clnp_discard(m, GEN_INCOMPLETE);
return;
}
CLNP_EXTRACT_ADDR(src, hoff, hend);
- if (hoff == (caddr_t)0) {
+ if (hoff == (caddr_t) 0) {
INCSTAT(cns_badaddr);
clnp_discard(m, GEN_INCOMPLETE);
return;
}
-
- IFDEBUG(D_INPUT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_INPUT]) {
printf("clnp_input: from %s", clnp_iso_addrp(&src));
printf(" to %s\n", clnp_iso_addrp(&dst));
- ENDDEBUG
+ }
+#endif
/*
- * extract the segmentation information, if it is present.
- * drop packet on failure
+ * extract the segmentation information, if it is present.
+ * drop packet on failure
*/
if (((clnp->cnf_type & CNF_TYPE) != CLNP_ER) &&
- (clnp->cnf_type & CNF_SEG_OK)) {
+ (clnp->cnf_type & CNF_SEG_OK)) {
if (hoff + sizeof(struct clnp_segment) > hend) {
INCSTAT(cns_noseg);
clnp_discard(m, GEN_INCOMPLETE);
return;
} else {
- (void) bcopy(hoff, (caddr_t)&seg_part, sizeof(struct clnp_segment));
+ (void) bcopy(hoff, (caddr_t) & seg_part,
+ sizeof(struct clnp_segment));
/* make sure segmentation fields are in host order */
seg_part.cng_id = ntohs(seg_part.cng_id);
seg_part.cng_off = ntohs(seg_part.cng_off);
seg_part.cng_tot_len = ntohs(seg_part.cng_tot_len);
- seg_off = hoff - (caddr_t)clnp;
+ seg_off = hoff - (caddr_t) clnp;
hoff += sizeof(struct clnp_segment);
}
}
-
/*
- * process options if present. If clnp_opt_sanity returns
- * false (indicating an error was found in the options) or
- * an unsupported option was found
- * then drop packet and emit an ER.
+ * process options if present. If clnp_opt_sanity returns
+ * false (indicating an error was found in the options) or
+ * an unsupported option was found
+ * then drop packet and emit an ER.
*/
if (hoff < hend) {
- int errcode;
+ int errcode;
oidxp = &oidx;
- errcode = clnp_opt_sanity(m, hoff, hend-hoff, oidxp);
+ errcode = clnp_opt_sanity(m, hoff, hend - hoff, oidxp);
/* we do not support security */
if ((errcode == 0) && (oidxp->cni_securep))
errcode = DISC_UNSUPPSECURE;
/* the er option is valid with ER pdus only */
- if ((errcode == 0) && (oidxp->cni_er_reason != ER_INVALREAS) &&
- ((clnp->cnf_type & CNF_TYPE) != CLNP_ER))
+ if ((errcode == 0) && (oidxp->cni_er_reason != ER_INVALREAS) &&
+ ((clnp->cnf_type & CNF_TYPE) != CLNP_ER))
errcode = DISC_UNSUPPOPT;
#ifdef DECBIT
/* check if the congestion experienced bit is set */
if (oidxp->cni_qos_formatp) {
- caddr_t qosp = CLNP_OFFTOOPT(m, oidxp->cni_qos_formatp);
- u_char qos = *qosp;
+ caddr_t qosp = CLNP_OFFTOOPT(m, oidxp->cni_qos_formatp);
+ u_char qos = *qosp;
- need_afrin = ((qos & (CLNPOVAL_GLOBAL|CLNPOVAL_CONGESTED)) ==
- (CLNPOVAL_GLOBAL|CLNPOVAL_CONGESTED));
+ need_afrin = ((qos & (CLNPOVAL_GLOBAL | CLNPOVAL_CONGESTED)) ==
+ (CLNPOVAL_GLOBAL | CLNPOVAL_CONGESTED));
if (need_afrin)
INCSTAT(cns_congest_rcvd);
}
-#endif /* DECBIT */
+#endif /* DECBIT */
if (errcode != 0) {
- clnp_discard(m, (char)errcode);
- IFDEBUG(D_INPUT)
- printf("clnp_input: dropped (err x%x) due to bad options\n",
- errcode);
- ENDDEBUG
+ clnp_discard(m, (char) errcode);
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_INPUT]) {
+ printf(
+ "clnp_input: dropped (err x%x) due to bad options\n",
+ errcode);
+ }
+#endif
return;
}
}
-
/*
* check if this packet is for us. if not, then forward
*/
if (clnp_ours(&dst) == 0) {
- IFDEBUG(D_INPUT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_INPUT]) {
printf("clnp_input: forwarding packet not for us\n");
- ENDDEBUG
- clnp_forward(m, seg_len, &dst, oidxp, seg_off, shp);
+ }
+#endif
+ clnp_forward(m, seg_len, &dst, oidxp, seg_off, shp);
return;
}
-
/*
* ESIS Configuration Response Function
*
* all end systems, then send an esh to the source
*/
if ((shp->snh_flags & M_MCAST) && (iso_systype == SNPA_ES)) {
- extern short esis_holding_time;
+ extern short esis_holding_time;
esis_shoutput(shp->snh_ifp, ESIS_ESH, esis_holding_time,
- shp->snh_shost, 6, &dst);
+ shp->snh_shost, 6, &dst);
}
-
/*
- * If this is a fragment, then try to reassemble it. If clnp_reass
- * returns non NULL, the packet has been reassembled, and should
- * be give to TP. Otherwise the fragment has been delt with
- * by the reassembly code (either stored or deleted). In either case
- * we should have nothing more to do with it.
+ * If this is a fragment, then try to reassemble it. If clnp_reass
+ * returns non NULL, the packet has been reassembled, and should
+ * be give to TP. Otherwise the fragment has been delt with
+ * by the reassembly code (either stored or deleted). In either case
+ * we should have nothing more to do with it.
*/
if (((clnp->cnf_type & CNF_TYPE) != CLNP_ER) &&
- (clnp->cnf_type & CNF_SEG_OK) &&
- (seg_len != seg_part.cng_tot_len)) {
- struct mbuf *m0;
+ (clnp->cnf_type & CNF_SEG_OK) &&
+ (seg_len != seg_part.cng_tot_len)) {
+ struct mbuf *m0;
if ((m0 = clnp_reass(m, &src, &dst, &seg_part)) != NULL) {
m = m0;
return;
}
}
-
/*
* give the packet to the higher layer
*
case CLNP_DT:
(*isosw[clnp_protox[ISOPROTO_TP]].pr_input)(m, &source, &target,
- clnp->cnf_hdr_len, need_afrin);
+ clnp->cnf_hdr_len, need_afrin);
break;
- case CLNP_RAW:
+ case CLNP_RAW:
case CLNP_ECR:
- IFDEBUG(D_INPUT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_INPUT]) {
printf("clnp_input: raw input of %d bytes\n",
- clnp->cnf_type & CNF_SEG_OK ? seg_part.cng_tot_len : seg_len);
- ENDDEBUG
- (*isosw[clnp_protox[ISOPROTO_RAW]].pr_input)(m, &source, &target,
- clnp->cnf_hdr_len);
+ clnp->cnf_type & CNF_SEG_OK ?
+ seg_part.cng_tot_len : seg_len);
+ }
+#endif
+ (*isosw[clnp_protox[ISOPROTO_RAW]].pr_input)(m, &source,
+ &target,
+ clnp->cnf_hdr_len);
break;
case CLNP_EC:
- IFDEBUG(D_INPUT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_INPUT]) {
printf("clnp_input: echoing packet\n");
- ENDDEBUG
- (void)clnp_echoreply(m,
- (clnp->cnf_type & CNF_SEG_OK ? (int)seg_part.cng_tot_len : seg_len),
- &source, &target, oidxp);
+ }
+#endif
+ (void) clnp_echoreply(m, (clnp->cnf_type & CNF_SEG_OK ?
+ (int) seg_part.cng_tot_len : seg_len),
+ &source, &target, oidxp);
break;
default:
- printf("clnp_input: unknown clnp pkt type %d\n",
- clnp->cnf_type & CNF_TYPE);
+ printf("clnp_input: unknown clnp pkt type %d\n",
+ clnp->cnf_type & CNF_TYPE);
clnp_stat.cns_delivered--;
clnp_stat.cns_noproto++;
clnp_discard(m, GEN_HDRSYNTAX);
- break;
+ break;
}
}
-#endif /* ISO */
+#endif /* ISO */
-/* $NetBSD: clnp_options.c,v 1.5 1994/06/29 06:39:14 cgd Exp $ */
+/* $OpenBSD: clnp_options.c,v 1.2 1996/03/04 10:34:55 mickey Exp $ */
+/* $NetBSD: clnp_options.c,v 1.6 1996/02/13 22:08:32 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
#include <sys/socket.h>
#include <sys/socketvar.h>
#include <sys/errno.h>
+#include <sys/systm.h>
#include <net/if.h>
#include <net/route.h>
/*
* FUNCTION: clnp_update_srcrt
*
- * PURPOSE: Process src rt option accompanying a clnp datagram.
- * - bump src route ptr if src routing and
- * we appear current in src route list.
+ * PURPOSE: Process src rt option accompanying a clnp datagram.
+ * - bump src route ptr if src routing and
+ * we appear current in src route list.
*
- * RETURNS: none
+ * RETURNS: none
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES: If source routing has been terminated, do nothing.
+ * NOTES: If source routing has been terminated, do nothing.
*/
+void
clnp_update_srcrt(options, oidx)
-struct mbuf *options; /* ptr to options mbuf */
-struct clnp_optidx *oidx; /* ptr to option index */
+ struct mbuf *options;/* ptr to options mbuf */
+ struct clnp_optidx *oidx; /* ptr to option index */
{
- u_char len; /* length of current address */
- struct iso_addr isoa; /* copy current address into here */
+ u_char len; /* length of current address */
+ struct iso_addr isoa; /* copy current address into here */
if (CLNPSRCRT_TERM(oidx, options)) {
- IFDEBUG(D_OPTIONS)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_OPTIONS]) {
printf("clnp_update_srcrt: src rt terminated\n");
- ENDDEBUG
+ }
+#endif
return;
}
-
len = CLNPSRCRT_CLEN(oidx, options);
- bcopy(CLNPSRCRT_CADDR(oidx, options), (caddr_t)&isoa, len);
+ bcopy(CLNPSRCRT_CADDR(oidx, options), (caddr_t) & isoa, len);
isoa.isoa_len = len;
-
- IFDEBUG(D_OPTIONS)
- printf("clnp_update_srcrt: current src rt: %s\n",
- clnp_iso_addrp(&isoa));
- ENDDEBUG
+
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_OPTIONS]) {
+ printf("clnp_update_srcrt: current src rt: %s\n",
+ clnp_iso_addrp(&isoa));
+ }
+#endif
if (clnp_ours(&isoa)) {
- IFDEBUG(D_OPTIONS)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_OPTIONS]) {
printf("clnp_update_srcrt: updating src rt\n");
- ENDDEBUG
+ }
+#endif
/* update pointer to next src route */
- len++; /* count length byte too! */
+ len++; /* count length byte too! */
CLNPSRCRT_OFF(oidx, options) += len;
}
}
/*
* FUNCTION: clnp_dooptions
*
- * PURPOSE: Process options accompanying a clnp datagram.
- * Processing includes
- * - log our address if recording route
+ * PURPOSE: Process options accompanying a clnp datagram.
+ * Processing includes
+ * - log our address if recording route
*
* RETURNS: none
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
*/
+void
clnp_dooptions(options, oidx, ifp, isoa)
-struct mbuf *options; /* ptr to options mbuf */
-struct clnp_optidx *oidx; /* ptr to option index */
-struct ifnet *ifp; /* ptr to interface pkt is leaving on */
-struct iso_addr *isoa; /* ptr to our address for this ifp */
+ struct mbuf *options;/* ptr to options mbuf */
+ struct clnp_optidx *oidx; /* ptr to option index */
+ struct ifnet *ifp; /* ptr to interface pkt is leaving on */
+ struct iso_addr *isoa; /* ptr to our address for this ifp */
{
/*
* If record route is specified, move all
* interface passed
*/
if (oidx->cni_recrtp) {
- char *opt; /* ptr to beginning of recrt option */
- u_char off; /* offset from opt of first free byte */
- char *rec_start; /* beginning of new rt recorded */
+ char *opt; /* ptr to beginning of recrt option */
+ u_char off; /* offset from opt of first free byte */
+ char *rec_start; /* beginning of new rt
+ * recorded */
opt = CLNP_OFFTOOPT(options, oidx->cni_recrtp);
off = *(opt + 1);
rec_start = opt + off - 1;
- IFDEBUG(D_OPTIONS)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_OPTIONS]) {
printf("clnp_dooptions: record route: option x%x for %d bytes\n",
- opt, oidx->cni_recrt_len);
+ (unsigned int) opt, oidx->cni_recrt_len);
printf("\tfree slot offset x%x\n", off);
printf("clnp_dooptions: recording %s\n", clnp_iso_addrp(isoa));
printf("clnp_dooptions: option dump:\n");
dump_buf(opt, oidx->cni_recrt_len);
- ENDDEBUG
+ }
+#endif
/* proceed only if recording has not been terminated */
if (off != 0xff) {
- int new_addrlen = isoa->isoa_len + 1;
- /*
- * if there is insufficient room to store the next address,
- * then terminate recording. Plus 1 on isoa_len is for the
- * length byte itself
+ int new_addrlen = isoa->isoa_len + 1;
+ /*
+ * if there is insufficient room to store the next
+ * address, then terminate recording. Plus 1 on
+ * isoa_len is for the length byte itself
*/
if (oidx->cni_recrt_len - (off - 1) < new_addrlen) {
*(opt + 1) = 0xff; /* terminate recording */
} else {
- IFDEBUG(D_OPTIONS)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_OPTIONS]) {
printf("clnp_dooptions: new addr at x%x for %d\n",
- rec_start, new_addrlen);
- ENDDEBUG
+ (unsigned int) rec_start,
+ new_addrlen);
+ }
+#endif
- bcopy((caddr_t)isoa, rec_start, new_addrlen);
+ bcopy((caddr_t) isoa, rec_start, new_addrlen);
/* update offset field */
*(opt + 1) += new_addrlen;
- IFDEBUG(D_OPTIONS)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_OPTIONS]) {
printf("clnp_dooptions: new option dump:\n");
dump_buf(opt, oidx->cni_recrt_len);
- ENDDEBUG
+ }
+#endif
}
}
}
/*
* FUNCTION: clnp_set_opts
*
- * PURPOSE: Check the data mbuf passed for option sanity. If it is
- * ok, then set the options ptr to address the data mbuf.
- * If an options mbuf exists, free it. This implies that
- * any old options will be lost. If data is NULL, simply
- * free any old options.
+ * PURPOSE: Check the data mbuf passed for option sanity. If it is
+ * ok, then set the options ptr to address the data mbuf.
+ * If an options mbuf exists, free it. This implies that
+ * any old options will be lost. If data is NULL, simply
+ * free any old options.
*
- * RETURNS: unix error code
+ * RETURNS: unix error code
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
*/
+int
clnp_set_opts(options, data)
-struct mbuf **options; /* target for option information */
-struct mbuf **data; /* source of option information */
+ struct mbuf **options;/* target for option information */
+ struct mbuf **data; /* source of option information */
{
- int error = 0; /* error return value */
- struct clnp_optidx dummy; /* dummy index - not used */
+ int error = 0; /* error return value */
+ struct clnp_optidx dummy; /* dummy index - not used */
/*
* remove any existing options
m_freem(*options);
*options = NULL;
}
-
if (*data != NULL) {
/*
* Insure that the options are reasonable.
*
* The QOS parameter is checked for the DECBIT.
*/
- if ((clnp_opt_sanity(*data, mtod(*data, caddr_t), (*data)->m_len,
- &dummy) != 0) ||
- (dummy.cni_securep) ||
- (dummy.cni_priorp) ||
- (dummy.cni_er_reason != ER_INVALREAS)) {
+ if ((clnp_opt_sanity(*data, mtod(*data, caddr_t), (*data)->m_len,
+ &dummy) != 0) ||
+ (dummy.cni_securep) ||
+ (dummy.cni_priorp) ||
+ (dummy.cni_er_reason != ER_INVALREAS)) {
error = EINVAL;
} else {
*options = *data;
/*
* FUNCTION: clnp_opt_sanity
*
- * PURPOSE: Check the options (beginning at opts for len bytes) for
- * sanity. In addition, fill in the option index structure
- * in with information about each option discovered.
+ * PURPOSE: Check the options (beginning at opts for len bytes) for
+ * sanity. In addition, fill in the option index structure
+ * in with information about each option discovered.
*
- * RETURNS: success (options check out) - 0
- * failure - an ER pdu error code describing failure
+ * RETURNS: success (options check out) - 0
+ * failure - an ER pdu error code describing failure
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES: Each pointer field of the option index is filled in with
- * the offset from the beginning of the mbuf data, not the
- * actual address.
+ * NOTES: Each pointer field of the option index is filled in with
+ * the offset from the beginning of the mbuf data, not the
+ * actual address.
*/
+int
clnp_opt_sanity(m, opts, len, oidx)
-struct mbuf *m; /* mbuf options reside in */
-caddr_t opts; /* ptr to buffer containing options */
-int len; /* length of buffer */
-struct clnp_optidx *oidx; /* RETURN: filled in with option idx info */
+ struct mbuf *m; /* mbuf options reside in */
+ caddr_t opts; /* ptr to buffer containing options */
+ int len; /* length of buffer */
+ struct clnp_optidx *oidx; /* RETURN: filled in with option idx
+ * info */
{
- u_char opcode; /* code of particular option */
- u_char oplen; /* length of a particular option */
- caddr_t opts_end; /* ptr to end of options */
- u_char pad = 0, secure = 0, srcrt = 0, recrt = 0, qos = 0, prior = 0;
- /* flags for catching duplicate options */
-
- IFDEBUG(D_OPTIONS)
+ u_char opcode = 0; /* code of particular option */
+ u_char oplen; /* length of a particular option */
+ caddr_t opts_end; /* ptr to end of options */
+ u_char pad = 0, secure = 0, srcrt = 0, recrt = 0,
+ qos = 0, prior = 0;
+ /* flags for catching duplicate options */
+
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_OPTIONS]) {
printf("clnp_opt_sanity: checking %d bytes of data:\n", len);
dump_buf(opts, len);
- ENDDEBUG
+ }
+#endif
/* clear option index field if passed */
- bzero((caddr_t)oidx, sizeof(struct clnp_optidx));
+ bzero((caddr_t) oidx, sizeof(struct clnp_optidx));
/*
* We need to indicate whether the ER option is present. This is done
while (opts < opts_end) {
/* must have at least 2 bytes per option (opcode and len) */
if (opts + 2 > opts_end)
- return(GEN_INCOMPLETE);
-
+ return (GEN_INCOMPLETE);
+
opcode = *opts++;
oplen = *opts++;
- IFDEBUG(D_OPTIONS)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_OPTIONS]) {
printf("clnp_opt_sanity: opcode is %x and oplen %d\n",
- opcode, oplen);
+ opcode, oplen);
printf("clnp_opt_sanity: clnpoval_SRCRT is %x\n", CLNPOVAL_SRCRT);
- switch (opcode) {
- case CLNPOVAL_PAD: {
- printf("CLNPOVAL_PAD\n");
- } break;
- case CLNPOVAL_SECURE: {
- printf("CLNPOVAL_SECURE\n");
- } break;
- case CLNPOVAL_SRCRT: {
- printf("CLNPOVAL_SRCRT\n");
- } break;
- case CLNPOVAL_RECRT: {
- printf("CLNPOVAL_RECRT\n");
- } break;
- case CLNPOVAL_QOS: {
- printf("CLNPOVAL_QOS\n");
- } break;
- case CLNPOVAL_PRIOR: {
- printf("CLNPOVAL_PRIOR\n");
- } break;
- case CLNPOVAL_ERREAS: {
- printf("CLNPOVAL_ERREAS\n");
- } break;
- default:
- printf("UKNOWN option %x\n", opcode);
- }
- ENDDEBUG
+ switch (opcode) {
+ case CLNPOVAL_PAD:{
+ printf("CLNPOVAL_PAD\n");
+ } break;
+ case CLNPOVAL_SECURE:{
+ printf("CLNPOVAL_SECURE\n");
+ } break;
+ case CLNPOVAL_SRCRT:{
+ printf("CLNPOVAL_SRCRT\n");
+ } break;
+ case CLNPOVAL_RECRT:{
+ printf("CLNPOVAL_RECRT\n");
+ } break;
+ case CLNPOVAL_QOS:{
+ printf("CLNPOVAL_QOS\n");
+ } break;
+ case CLNPOVAL_PRIOR:{
+ printf("CLNPOVAL_PRIOR\n");
+ } break;
+ case CLNPOVAL_ERREAS:{
+ printf("CLNPOVAL_ERREAS\n");
+ } break;
+ default:
+ printf("UKNOWN option %x\n", opcode);
+ }
+ }
+#endif
/* don't allow crazy length values */
if (opts + oplen > opts_end)
- return(GEN_INCOMPLETE);
+ return (GEN_INCOMPLETE);
switch (opcode) {
- case CLNPOVAL_PAD:
- /*
- * Padding: increment pointer by length of padding
- */
- if (pad++) /* duplicate ? */
- return(GEN_DUPOPT);
- opts += oplen;
- break;
+ case CLNPOVAL_PAD:
+ /*
+ * Padding: increment pointer by length of padding
+ */
+ if (pad++) /* duplicate ? */
+ return (GEN_DUPOPT);
+ opts += oplen;
+ break;
- case CLNPOVAL_SECURE: {
- u_char format = *opts;
+ case CLNPOVAL_SECURE:{
+ u_char format = *opts;
- if (secure++) /* duplicate ? */
- return(GEN_DUPOPT);
+ if (secure++) /* duplicate ? */
+ return (GEN_DUPOPT);
/*
* Security: high 2 bits of first octet indicate format
* (00 in high bits is reserved).
* actual security
*/
if (((format & 0x3f) > 0) || /* low 6 bits set ? */
- ((format & 0xc0) == 0)) /* high 2 bits zero ? */
- return(GEN_HDRSYNTAX);
+ ((format & 0xc0) == 0)) /* high 2 bits zero ? */
+ return (GEN_HDRSYNTAX);
oidx->cni_securep = CLNP_OPTTOOFF(m, opts);
oidx->cni_secure_len = oplen;
opts += oplen;
} break;
- case CLNPOVAL_SRCRT: {
- u_char type, offset; /* type of rt, offset of start */
- caddr_t route_end; /* address of end of route option */
+ case CLNPOVAL_SRCRT:{
+ u_char type, offset; /* type of rt, offset of
+ * start */
+ caddr_t route_end; /* address of end of
+ * route option */
- IFDEBUG(D_OPTIONS)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_OPTIONS]) {
printf("clnp_opt_sanity: SRC RT\n");
- ENDDEBUG
-
- if (srcrt++) /* duplicate ? */
- return(GEN_DUPOPT);
- /*
- * source route: There must be 2 bytes following the length
- * field: type and offset. The type must be either
- * partial route or complete route. The offset field must
- * be within the option. A single exception is made, however.
- * The offset may be 1 greater than the length. This case
- * occurs when the last source route record is consumed.
- * In this case, we ignore the source route option.
- * RAH? You should be able to set offset to 'ff' like in record
- * route!
- * Following this is a series of address fields.
- * Each address field is composed of a (length, address) pair.
- * Insure that the offset and each address length is reasonable
+ }
+#endif
+
+ if (srcrt++) /* duplicate ? */
+ return (GEN_DUPOPT);
+ /*
+ * source route: There must be 2 bytes
+ * following the length field: type and
+ * offset. The type must be either partial
+ * route or complete route. The offset field
+ * must be within the option. A single
+ * exception is made, however. The offset may
+ * be 1 greater than the length. This case
+ * occurs when the last source route record
+ * is consumed. In this case, we ignore the
+ * source route option. RAH? You should be
+ * able to set offset to 'ff' like in record
+ * route! Following this is a series of
+ * address fields. Each address field is
+ * composed of a (length, address) pair.
+ * Insure that the offset and each address
+ * length is reasonable
*/
route_end = opts + oplen;
if (opts + 2 > route_end)
- return(SRCRT_SYNTAX);
+ return (SRCRT_SYNTAX);
type = *opts;
- offset = *(opts+1);
+ offset = *(opts + 1);
/* type must be partial or complete */
if (!((type == CLNPOVAL_PARTRT) || (type == CLNPOVAL_COMPRT)))
- return(SRCRT_SYNTAX);
-
+ return (SRCRT_SYNTAX);
+
oidx->cni_srcrt_s = CLNP_OPTTOOFF(m, opts);
oidx->cni_srcrt_len = oplen;
- opts += offset-1; /*set opts to first addr in rt */
+ opts += offset - 1; /* set opts to first
+ * addr in rt */
- /*
- * Offset must be reasonable:
- * less than end of options, or equal to end of options
+ /*
+ * Offset must be reasonable: less than end
+ * of options, or equal to end of options
*/
if (opts >= route_end) {
if (opts == route_end) {
- IFDEBUG(D_OPTIONS)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_OPTIONS]) {
printf("clnp_opt_sanity: end of src route info\n");
- ENDDEBUG
+ }
+#endif
break;
- } else
- return(SRCRT_SYNTAX);
+ } else
+ return (SRCRT_SYNTAX);
}
-
while (opts < route_end) {
- u_char addrlen = *opts++;
+ u_char addrlen = *opts++;
if (opts + addrlen > route_end)
- return(SRCRT_SYNTAX);
+ return (SRCRT_SYNTAX);
opts += addrlen;
}
} break;
- case CLNPOVAL_RECRT: {
- u_char type, offset; /* type of rt, offset of start */
- caddr_t record_end; /* address of end of record option */
-
- if (recrt++) /* duplicate ? */
- return(GEN_DUPOPT);
+ case CLNPOVAL_RECRT:{
+ u_char type, offset; /* type of rt, offset of
+ * start */
+ caddr_t record_end; /* address of end of
+ * record option */
+
+ if (recrt++) /* duplicate ? */
+ return (GEN_DUPOPT);
/*
* record route: after the length field, expect a
* type and offset. Type must be partial or complete.
oidx->cni_recrt_len = oplen;
if (opts + 2 > record_end)
- return(GEN_INCOMPLETE);
+ return (GEN_INCOMPLETE);
type = *opts;
- offset = *(opts+1);
+ offset = *(opts + 1);
/* type must be partial or complete */
if (!((type == CLNPOVAL_PARTRT) || (type == CLNPOVAL_COMPRT)))
- return(GEN_HDRSYNTAX);
-
+ return (GEN_HDRSYNTAX);
+
/* offset must be reasonable */
if ((offset < 0xff) && (opts + offset > record_end))
- return(GEN_HDRSYNTAX);
+ return (GEN_HDRSYNTAX);
opts += oplen;
} break;
- case CLNPOVAL_QOS: {
- u_char format = *opts;
+ case CLNPOVAL_QOS:{
+ u_char format = *opts;
- if (qos++) /* duplicate ? */
- return(GEN_DUPOPT);
+ if (qos++) /* duplicate ? */
+ return (GEN_DUPOPT);
/*
* qos: high 2 bits of first octet indicate format
* (00 in high bits is reserved).
* remaining octets indicate actual qos.
*/
if (((format & 0xc0) == 0) || /* high 2 bits zero ? */
- (((format & 0xc0) != CLNPOVAL_GLOBAL) &&
- ((format & 0x3f) > 0))) /* not global,low bits used ? */
- return(GEN_HDRSYNTAX);
-
+ (((format & 0xc0) != CLNPOVAL_GLOBAL) &&
+ ((format & 0x3f) > 0))) /* not global,low bits
+ * used ? */
+ return (GEN_HDRSYNTAX);
+
oidx->cni_qos_formatp = CLNP_OPTTOOFF(m, opts);
oidx->cni_qos_len = oplen;
opts += oplen;
} break;
- case CLNPOVAL_PRIOR: {
- if (prior++) /* duplicate ? */
- return(GEN_DUPOPT);
+ case CLNPOVAL_PRIOR:{
+ if (prior++) /* duplicate ? */
+ return (GEN_DUPOPT);
/*
* priority: value must be one byte long
*/
if (oplen != 1)
- return(GEN_HDRSYNTAX);
-
+ return (GEN_HDRSYNTAX);
+
oidx->cni_priorp = CLNP_OPTTOOFF(m, opts);
opts += oplen;
} break;
- case CLNPOVAL_ERREAS: {
+ case CLNPOVAL_ERREAS:{
/*
* er reason: value must be two bytes long
*/
if (oplen != 2)
- return(GEN_HDRSYNTAX);
+ return (GEN_HDRSYNTAX);
oidx->cni_er_reason = *opts;
opts += oplen;
} break;
- default: {
- IFDEBUG(D_OPTIONS)
+ default:{
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_OPTIONS]) {
printf("clnp_opt_sanity: UNKNOWN OPTION 0x%x\n", opcode);
- ENDDEBUG
- return(DISC_UNSUPPOPT);
+ }
+#endif
+ return (DISC_UNSUPPOPT);
}
}
}
- IFDEBUG(D_OPTIONS)
- printf("clnp_opt_sanity: return(0)\n", opcode);
- ENDDEBUG
- return(0);
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_OPTIONS]) {
+ printf("clnp_opt_sanity: return(0)\n");
+ }
+#endif
+ return (0);
}
-#endif /* ISO */
+#endif /* ISO */
-/* $NetBSD: clnp_output.c,v 1.7 1995/06/13 07:58:10 mycroft Exp $ */
+/* $OpenBSD: clnp_output.c,v 1.2 1996/03/04 10:34:57 mickey Exp $ */
+/* $NetBSD: clnp_output.c,v 1.8 1996/02/13 22:08:39 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
#include <sys/socketvar.h>
#include <sys/errno.h>
#include <sys/time.h>
+#include <sys/systm.h>
#include <net/if.h>
#include <net/route.h>
#include <netiso/clnp_stat.h>
#include <netiso/argo_debug.h>
+#include <machine/stdarg.h>
+
static struct clnp_fixed dt_template = {
- ISO8473_CLNP, /* network identifier */
- 0, /* length */
+ ISO8473_CLNP, /* network identifier */
+ 0, /* length */
ISO8473_V1, /* version */
CLNP_TTL, /* ttl */
- CLNP_DT|CNF_SEG_OK|CNF_ERR_OK, /* type */
- 0, /* segment length */
- 0 /* checksum */
+ CLNP_DT | CNF_SEG_OK | CNF_ERR_OK, /* type */
+ 0, /* segment length */
+ 0 /* checksum */
};
static struct clnp_fixed raw_template = {
- ISO8473_CLNP, /* network identifier */
- 0, /* length */
+ ISO8473_CLNP, /* network identifier */
+ 0, /* length */
ISO8473_V1, /* version */
CLNP_TTL, /* ttl */
- CLNP_RAW|CNF_SEG_OK|CNF_ERR_OK, /* type */
- 0, /* segment length */
- 0 /* checksum */
+ CLNP_RAW | CNF_SEG_OK | CNF_ERR_OK, /* type */
+ 0, /* segment length */
+ 0 /* checksum */
};
static struct clnp_fixed echo_template = {
- ISO8473_CLNP, /* network identifier */
- 0, /* length */
+ ISO8473_CLNP, /* network identifier */
+ 0, /* length */
ISO8473_V1, /* version */
CLNP_TTL, /* ttl */
- CLNP_EC|CNF_SEG_OK|CNF_ERR_OK, /* type */
- 0, /* segment length */
- 0 /* checksum */
+ CLNP_EC | CNF_SEG_OK | CNF_ERR_OK, /* type */
+ 0, /* segment length */
+ 0 /* checksum */
};
static struct clnp_fixed echor_template = {
- ISO8473_CLNP, /* network identifier */
- 0, /* length */
+ ISO8473_CLNP, /* network identifier */
+ 0, /* length */
ISO8473_V1, /* version */
CLNP_TTL, /* ttl */
- CLNP_ECR|CNF_SEG_OK|CNF_ERR_OK, /* type */
- 0, /* segment length */
- 0 /* checksum */
+ CLNP_ECR | CNF_SEG_OK | CNF_ERR_OK, /* type */
+ 0, /* segment length */
+ 0 /* checksum */
};
#ifdef DECBIT
-u_char qos_option[] = {CLNPOVAL_QOS, 1,
- CLNPOVAL_GLOBAL|CLNPOVAL_SEQUENCING|CLNPOVAL_LOWDELAY};
-#endif /* DECBIT */
+u_char qos_option[] = {CLNPOVAL_QOS, 1,
+CLNPOVAL_GLOBAL | CLNPOVAL_SEQUENCING | CLNPOVAL_LOWDELAY};
+#endif /* DECBIT */
-int clnp_id = 0; /* id for segmented dgrams */
+int clnp_id = 0; /* id for segmented dgrams */
/*
* FUNCTION: clnp_output
*
- * PURPOSE: output the data in the mbuf as a clnp datagram
+ * PURPOSE: output the data in the mbuf as a clnp datagram
*
- * The data specified by m0 is sent as a clnp datagram.
- * The mbuf chain m0 will be freed when this routine has
- * returned.
+ * The data specified by m0 is sent as a clnp datagram.
+ * The mbuf chain m0 will be freed when this routine has
+ * returned.
*
- * If options is non-null, it points to an mbuf which contains
- * options to be sent with the datagram. The options must
- * be formatted in the mbuf according to clnp rules. Options
- * will not be freed.
+ * If options is non-null, it points to an mbuf which
+ * contains options to be sent with the datagram. The
+ * options must be formatted in the mbuf according to
+ * clnp rules. Options will not be freed.
*
- * Datalen specifies the length of the data in m0.
+ * Datalen specifies the length of the data in m0.
*
- * Src and dst are the addresses for the packet.
+ * Src and dst are the addresses for the packet.
*
- * If route is non-null, it is used as the route for
- * the packet.
+ * If route is non-null, it is used as the route for
+ * the packet.
*
- * By default, a DT is sent. However, if flags & CNLP_SEND_ER
- * then an ER will be sent. If flags & CLNP_SEND_RAW, then
- * the packet will be send as raw clnp.
+ * By default, a DT is sent. However,
+ * if flags & CNLP_SEND_ER then an ER will be sent.
+ * If flags & CLNP_SEND_RAW, then the packet will
+ * be send as raw clnp.
*
- * RETURNS: 0 success
- * appropriate error code
+ * RETURNS: 0 success
+ * appropriate error code
*
* SIDE EFFECTS: none
*
- * NOTES:
- * Flags are interpretated as follows:
- * CLNP_NO_SEG - do not allow this pkt to be segmented.
- * CLNP_NO_ER - have pkt request ER suppression.
- * CLNP_SEND_RAW - send pkt as RAW DT rather than TP DT
- * CLNP_NO_CKSUM - don't compute clnp checksum
- * CLNP_ECHO - send as ECHO packet
+ * NOTES: Flags are interpretated as follows:
+ * CLNP_NO_SEG - do not allow this pkt to be segmented.
+ * CLNP_NO_ER - have pkt request ER suppression.
+ * CLNP_SEND_RAW - send pkt as RAW DT rather than TP DT
+ * CLNP_NO_CKSUM - don't compute clnp checksum
+ * CLNP_ECHO - send as ECHO packet
*
- * When checking for a cached packet, clnp checks
- * that the route taken is still up. It does not
- * check that the route is still to the same destination.
- * This means that any entity that alters an existing
- * route for an isopcb (such as when a redirect arrives)
- * must invalidate the clnp cache. It might be perferable
- * to have clnp check that the route has the same dest, but
- * by avoiding this check, we save a call to iso_addrmatch1.
+ * When checking for a cached packet, clnp checks
+ * that the route taken is still up. It does not
+ * check that the route is still to the same destination.
+ * This means that any entity that alters an existing
+ * route for an isopcb (such as when a redirect arrives)
+ * must invalidate the clnp cache. It might be perferable
+ * to have clnp check that the route has the same dest, but
+ * by avoiding this check, we save a call to
+ * iso_addrmatch1.
*/
-clnp_output(m0, isop, datalen, flags)
-struct mbuf *m0; /* data for the packet */
-struct isopcb *isop; /* iso pcb */
-int datalen; /* number of bytes of data in m0 */
-int flags; /* flags */
+int
+#if __STDC__
+clnp_output(struct mbuf *m0, ...)
+#else
+clnp_output(m0, va_alist)
+ struct mbuf *m0; /* data for the packet */
+ va_dcl
+#endif
{
- int error = 0; /* return value of function */
- register struct mbuf *m = m0; /* mbuf for clnp header chain */
- register struct clnp_fixed *clnp; /* ptr to fixed part of hdr */
- register caddr_t hoff; /* offset into header */
- int total_len; /* total length of packet */
- struct iso_addr *src; /* ptr to source address */
- struct iso_addr *dst; /* ptr to destination address */
- struct clnp_cache clc; /* storage for cache information */
- struct clnp_cache *clcp = NULL; /* ptr to clc */
- int hdrlen = 0;
+ struct isopcb *isop; /* iso pcb */
+ int datalen;/* number of bytes of data in m0 */
+ int flags; /* flags */
+ int error = 0; /* return value of function */
+ register struct mbuf *m = m0; /* mbuf for clnp header chain */
+ register struct clnp_fixed *clnp; /* ptr to fixed part of hdr */
+ register caddr_t hoff; /* offset into header */
+ int total_len; /* total length of packet */
+ struct iso_addr *src; /* ptr to source address */
+ struct iso_addr *dst; /* ptr to destination address */
+ struct clnp_cache clc; /* storage for cache information */
+ struct clnp_cache *clcp = NULL; /* ptr to clc */
+ int hdrlen = 0;
+ va_list ap;
+
+ va_start(ap, m0);
+ isop = va_arg(ap, struct isopcb *);
+ datalen = va_arg(ap, int);
+ flags = va_arg(ap, int);
+ va_end(ap);
dst = &isop->isop_faddr->siso_addr;
if (isop->isop_laddr == 0) {
} else
src = &isop->isop_laddr->siso_addr;
- IFDEBUG(D_OUTPUT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_OUTPUT]) {
printf("clnp_output: to %s", clnp_iso_addrp(dst));
printf(" from %s of %d bytes\n", clnp_iso_addrp(src), datalen);
- printf("\toptions x%x, flags x%x, isop_clnpcache x%x\n",
- isop->isop_options, flags, isop->isop_clnpcache);
- ENDDEBUG
+ printf("\toptions x%x, flags x%x, isop_clnpcache x%x\n",
+ (unsigned int) isop->isop_options, flags,
+ (unsigned int) isop->isop_clnpcache);
+ }
+#endif
if (isop->isop_clnpcache != NULL) {
clcp = mtod(isop->isop_clnpcache, struct clnp_cache *);
}
-
/*
* Check if cache is valid ...
*/
- IFDEBUG(D_OUTPUT)
- printf("clnp_output: ck cache: clcp %x\n", clcp);
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_OUTPUT]) {
+ printf("clnp_output: ck cache: clcp %x\n", (unsigned int) clcp);
if (clcp != NULL) {
printf("\tclc_dst %s\n", clnp_iso_addrp(&clcp->clc_dst));
- printf("\tisop_opts x%x, clc_opts x%x\n", isop->isop_options,
- clcp->clc_options);
+ printf("\tisop_opts x%x, clc_opts x%x\n",
+ (unsigned int) isop->isop_options,
+ (unsigned int) clcp->clc_options);
if (isop->isop_route.ro_rt)
printf("\tro_rt x%x, rt_flags x%x\n",
- isop->isop_route.ro_rt, isop->isop_route.ro_rt->rt_flags);
- printf("\tflags x%x, clc_flags x%x\n", flags, clcp->clc_flags);
- printf("\tclc_hdr x%x\n", clcp->clc_hdr);
+ (unsigned int) isop->isop_route.ro_rt,
+ isop->isop_route.ro_rt->rt_flags);
+ printf("\tflags x%x, clc_flags x%x\n", flags,
+ clcp->clc_flags);
+ printf("\tclc_hdr x%x\n", (unsigned int) clcp->clc_hdr);
}
- ENDDEBUG
- if ((clcp != NULL) && /* cache exists */
- (isop->isop_options == clcp->clc_options) && /* same options */
- (iso_addrmatch1(dst, &clcp->clc_dst)) && /* dst still same */
- (isop->isop_route.ro_rt != NULL) && /* route exists */
- (isop->isop_route.ro_rt == clcp->clc_rt) && /* and is cached */
- (isop->isop_route.ro_rt->rt_flags & RTF_UP) && /* route still up */
- (flags == clcp->clc_flags) && /* same flags */
- (clcp->clc_hdr != NULL)) { /* hdr mbuf exists */
+ }
+#endif
+ if ((clcp != NULL) && /* cache exists */
+ (isop->isop_options == clcp->clc_options) && /* same options */
+ (iso_addrmatch1(dst, &clcp->clc_dst)) && /* dst still same */
+ (isop->isop_route.ro_rt != NULL) && /* route exists */
+ (isop->isop_route.ro_rt == clcp->clc_rt) && /* and is cached */
+ (isop->isop_route.ro_rt->rt_flags & RTF_UP) && /* route still up */
+ (flags == clcp->clc_flags) && /* same flags */
+ (clcp->clc_hdr != NULL)) { /* hdr mbuf exists */
/*
- * The cache is valid
+ * The cache is valid
*/
- IFDEBUG(D_OUTPUT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_OUTPUT]) {
printf("clnp_output: using cache\n");
- ENDDEBUG
+ }
+#endif
- m = m_copy(clcp->clc_hdr, 0, (int)M_COPYALL);
+ m = m_copy(clcp->clc_hdr, 0, (int) M_COPYALL);
if (m == NULL) {
/*
- * No buffers left to copy cached packet header. Use
- * the cached packet header this time, and
- * mark the hdr as vacant
+ * No buffers left to copy cached packet header. Use
+ * the cached packet header this time, and
+ * mark the hdr as vacant
*/
m = clcp->clc_hdr;
clcp->clc_hdr = NULL;
m->m_next = m0; /* ASSUMES pkt hdr is 1 mbuf long */
clnp = mtod(m, struct clnp_fixed *);
} else {
- struct clnp_optidx *oidx = NULL; /* index to clnp options */
+ struct clnp_optidx *oidx = NULL; /* index to clnp options */
/*
- * The cache is not valid. Allocate an mbuf (if necessary)
- * to hold cached info. If one is not available, then
- * don't bother with the cache
+ * The cache is not valid. Allocate an mbuf (if necessary)
+ * to hold cached info. If one is not available, then
+ * don't bother with the cache
*/
INCSTAT(cns_cachemiss);
if (flags & CLNP_NOCACHE) {
} else {
if (isop->isop_clnpcache == NULL) {
/*
- * There is no clnpcache. Allocate an mbuf to hold one
+ * There is no clnpcache. Allocate an mbuf
+ * to hold one
*/
if ((isop->isop_clnpcache = m_get(M_DONTWAIT, MT_HEADER))
- == NULL) {
+ == NULL) {
/*
- * No mbufs available. Pretend that we don't want
- * caching this time.
+ * No mbufs available. Pretend that we
+ * don't want caching this time.
*/
- IFDEBUG(D_OUTPUT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_OUTPUT]) {
printf("clnp_output: no mbufs to allocate to cache\n");
- ENDDEBUG
- flags |= CLNP_NOCACHE;
+ }
+#endif
+ flags |= CLNP_NOCACHE;
clcp = &clc;
} else {
clcp = mtod(isop->isop_clnpcache, struct clnp_cache *);
}
} else {
/*
- * A clnpcache mbuf exists. If the clc_hdr is not null,
- * we must free it, as a new one is about to be created.
+ * A clnpcache mbuf exists. If the clc_hdr
+ * is not null, we must free it, as a new one
+ * is about to be created.
*/
clcp = mtod(isop->isop_clnpcache, struct clnp_cache *);
if (clcp->clc_hdr != NULL) {
/*
- * The clc_hdr is not null but a clnpcache mbuf exists.
- * This means that there was a cache, but the existing
- * copy of the hdr is no longer valid. Free it now
- * before we lose the pointer to it.
+ * The clc_hdr is not null but a
+ * clnpcache mbuf exists. This means
+ * that there was a cache, but the
+ * existing copy of the hdr is no
+ * longer valid. Free it now
+ * before we lose the pointer to it.
*/
- IFDEBUG(D_OUTPUT)
- printf("clnp_output: freeing old clc_hdr 0x%x\n",
- clcp->clc_hdr);
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_OUTPUT]) {
+ printf(
+ "clnp_output: freeing old clc_hdr 0x%x\n",
+ (unsigned int) clcp->clc_hdr);
+ }
+#endif
m_free(clcp->clc_hdr);
- IFDEBUG(D_OUTPUT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_OUTPUT]) {
printf("clnp_output: freed old clc_hdr (done)\n");
- ENDDEBUG
+ }
+#endif
}
}
}
- IFDEBUG(D_OUTPUT)
- printf("clnp_output: NEW clcp x%x\n",clcp);
- ENDDEBUG
- bzero((caddr_t)clcp, sizeof(struct clnp_cache));
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_OUTPUT]) {
+ printf("clnp_output: NEW clcp x%x\n",
+ (unsigned int) clcp);
+ }
+#endif
+ bzero((caddr_t) clcp, sizeof(struct clnp_cache));
if (isop->isop_optindex)
oidx = mtod(isop->isop_optindex, struct clnp_optidx *);
/*
- * Don't allow packets with security, quality of service,
- * priority, or error report options to be sent.
+ * Don't allow packets with security, quality of service,
+ * priority, or error report options to be sent.
*/
if ((isop->isop_options) && (oidx)) {
if ((oidx->cni_securep) ||
- (oidx->cni_priorp) ||
- (oidx->cni_qos_formatp) ||
- (oidx->cni_er_reason != ER_INVALREAS)) {
- IFDEBUG(D_OUTPUT)
+ (oidx->cni_priorp) ||
+ (oidx->cni_qos_formatp) ||
+ (oidx->cni_er_reason != ER_INVALREAS)) {
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_OUTPUT]) {
printf("clnp_output: pkt dropped - option unsupported\n");
- ENDDEBUG
+ }
+#endif
m_freem(m0);
- return(EINVAL);
+ return (EINVAL);
}
}
-
/*
- * Don't allow any invalid flags to be set
+ * Don't allow any invalid flags to be set
*/
if ((flags & (CLNP_VFLAGS)) != flags) {
- IFDEBUG(D_OUTPUT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_OUTPUT]) {
printf("clnp_output: packet dropped - flags unsupported\n");
- ENDDEBUG
+ }
+#endif
INCSTAT(cns_odropped);
m_freem(m0);
- return(EINVAL);
+ return (EINVAL);
}
-
/*
- * Don't allow funny lengths on dst; src may be zero in which
- * case we insert the source address based upon the interface
+ * Don't allow funny lengths on dst; src may be zero in which
+ * case we insert the source address based upon the interface
*/
- if ((src->isoa_len > sizeof(struct iso_addr)) ||
- (dst->isoa_len == 0) ||
- (dst->isoa_len > sizeof(struct iso_addr))) {
+ if ((src->isoa_len > sizeof(struct iso_addr)) ||
+ (dst->isoa_len == 0) ||
+ (dst->isoa_len > sizeof(struct iso_addr))) {
m_freem(m0);
INCSTAT(cns_odropped);
- return(ENAMETOOLONG);
+ return (ENAMETOOLONG);
}
-
/*
* Grab mbuf to contain header
*/
if (m == 0) {
m_freem(m0);
INCSTAT(cns_odropped);
- return(ENOBUFS);
+ return (ENOBUFS);
}
INCSTAT(cns_sent);
m->m_next = m0;
clcp->clc_segoff = 0;
/*
- * Fill in all of fixed hdr except lengths and checksum
+ * Fill in all of fixed hdr except lengths and checksum
*/
if (flags & CLNP_SEND_RAW) {
*clnp = raw_template;
* Route packet; special case for source rt
*/
if ((isop->isop_options) && CLNPSRCRT_VALID(oidx)) {
- IFDEBUG(D_OUTPUT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_OUTPUT]) {
printf("clnp_output: calling clnp_srcroute\n");
- ENDDEBUG
+ }
+#endif
error = clnp_srcroute(isop->isop_options, oidx, &isop->isop_route,
- &clcp->clc_firsthop, &clcp->clc_ifa, dst);
+ &clcp->clc_firsthop, &clcp->clc_ifa, dst);
} else {
- IFDEBUG(D_OUTPUT)
- ENDDEBUG
- error = clnp_route(dst, &isop->isop_route, flags,
- &clcp->clc_firsthop, &clcp->clc_ifa);
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_OUTPUT]) {
+ }
+#endif
+ error = clnp_route(dst, &isop->isop_route, flags,
+ &clcp->clc_firsthop, &clcp->clc_ifa);
}
if (error || (clcp->clc_ifa == 0)) {
- IFDEBUG(D_OUTPUT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_OUTPUT]) {
printf("clnp_output: route failed, errno %d\n", error);
printf("@clcp:\n");
- dump_buf(clcp, sizeof (struct clnp_cache));
- ENDDEBUG
+ dump_buf(clcp, sizeof(struct clnp_cache));
+ }
+#endif
goto bad;
}
clcp->clc_rt = isop->isop_route.ro_rt; /* XXX */
- clcp->clc_ifp = clcp->clc_ifa->ia_ifp; /* XXX */
-
- IFDEBUG(D_OUTPUT)
- printf("clnp_output: packet routed to %s\n",
- clnp_iso_addrp(
- &satosiso(clcp->clc_firsthop)->siso_addr));
- ENDDEBUG
-
+ clcp->clc_ifp = clcp->clc_ifa->ia_ifp; /* XXX */
+
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_OUTPUT]) {
+ printf("clnp_output: packet routed to %s\n",
+ clnp_iso_addrp(
+ &satosiso(clcp->clc_firsthop)->siso_addr));
+ }
+#endif
+
/*
- * If src address is not yet specified, use address of
- * interface. NOTE: this will now update the laddr field in
- * the isopcb. Is this desirable? RAH?
+ * If src address is not yet specified, use address of
+ * interface. NOTE: this will now update the laddr field in
+ * the isopcb. Is this desirable? RAH?
*/
if (src->isoa_len == 0) {
src = &(clcp->clc_ifa->ia_addr.siso_addr);
- IFDEBUG(D_OUTPUT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_OUTPUT]) {
printf("clnp_output: new src %s\n", clnp_iso_addrp(src));
- ENDDEBUG
+ }
+#endif
}
-
/*
- * Insert the source and destination address,
+ * Insert the source and destination address,
*/
- hoff = (caddr_t)clnp + sizeof(struct clnp_fixed);
+ hoff = (caddr_t) clnp + sizeof(struct clnp_fixed);
CLNP_INSERT_ADDR(hoff, *dst);
CLNP_INSERT_ADDR(hoff, *src);
/*
- * Leave room for the segment part, if segmenting is selected
+ * Leave room for the segment part, if segmenting is selected
*/
if (clnp->cnf_type & CNF_SEG_OK) {
- clcp->clc_segoff = hoff - (caddr_t)clnp;
+ clcp->clc_segoff = hoff - (caddr_t) clnp;
hoff += sizeof(struct clnp_segment);
}
-
- clnp->cnf_hdr_len = m->m_len = (u_char)(hoff - (caddr_t)clnp);
+ clnp->cnf_hdr_len = m->m_len = (u_char) (hoff - (caddr_t) clnp);
hdrlen = clnp->cnf_hdr_len;
#ifdef DECBIT
/*
- * Add the globally unique QOS (with room for congestion experienced
- * bit). I can safely assume that this option is not in the options
- * mbuf below because I checked that the option was not specified
- * previously
+ * Add the globally unique QOS (with room for congestion
+ * experienced bit). I can safely assume that this option
+ * is not in the options mbuf below because I checked that
+ * the option was not specified previously
*/
if ((m->m_len + sizeof(qos_option)) < MLEN) {
- bcopy((caddr_t)qos_option, hoff, sizeof(qos_option));
+ bcopy((caddr_t) qos_option, hoff, sizeof(qos_option));
clnp->cnf_hdr_len += sizeof(qos_option);
hdrlen += sizeof(qos_option);
m->m_len += sizeof(qos_option);
}
-#endif /* DECBIT */
+#endif /* DECBIT */
/*
- * If an options mbuf is present, concatenate a copy to the hdr mbuf.
+ * If an options mbuf is present, concatenate a copy to the hdr mbuf.
*/
if (isop->isop_options) {
- struct mbuf *opt_copy = m_copy(isop->isop_options, 0, (int)M_COPYALL);
+ struct mbuf *opt_copy =
+ m_copy(isop->isop_options, 0, (int) M_COPYALL);
if (opt_copy == NULL) {
error = ENOBUFS;
goto bad;
clnp->cnf_hdr_len += opt_copy->m_len;
hdrlen += opt_copy->m_len;
}
-
if (hdrlen > CLNP_HDR_MAX) {
error = EMSGSIZE;
goto bad;
}
-
/*
- * Now set up the cache entry in the pcb
+ * Now set up the cache entry in the pcb
*/
if ((flags & CLNP_NOCACHE) == 0) {
- if (clcp->clc_hdr = m_copy(m, 0, (int)clnp->cnf_hdr_len)) {
- clcp->clc_dst = *dst;
+ clcp->clc_hdr = m_copy(m, 0, (int) clnp->cnf_hdr_len);
+ if (clcp->clc_hdr) {
+ clcp->clc_dst = *dst;
clcp->clc_flags = flags;
clcp->clc_options = isop->isop_options;
}
*/
total_len = clnp->cnf_hdr_len + datalen;
if (clnp->cnf_type & CNF_SEG_OK) {
- struct clnp_segment seg_part; /* segment part of hdr */
+ struct clnp_segment seg_part; /* segment part of hdr */
seg_part.cng_id = htons(clnp_id++);
seg_part.cng_off = htons(0);
seg_part.cng_tot_len = htons(total_len);
- (void) bcopy((caddr_t)&seg_part, (caddr_t) clnp + clcp->clc_segoff,
- sizeof(seg_part));
+ (void) bcopy((caddr_t) & seg_part, (caddr_t) clnp + clcp->clc_segoff,
+ sizeof(seg_part));
}
if (total_len <= SN_MTU(clcp->clc_ifp, clcp->clc_rt)) {
HTOC(clnp->cnf_seglen_msb, clnp->cnf_seglen_lsb, total_len);
if (flags & CLNP_NO_CKSUM) {
HTOC(clnp->cnf_cksum_msb, clnp->cnf_cksum_lsb, 0);
} else {
- iso_gen_csum(m, CLNP_CKSUM_OFF, (int)clnp->cnf_hdr_len);
+ iso_gen_csum(m, CLNP_CKSUM_OFF, (int) clnp->cnf_hdr_len);
}
- IFDEBUG(D_DUMPOUT)
- struct mbuf *mdump = m;
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_DUMPOUT]) {
+ struct mbuf *mdump = m;
printf("clnp_output: sending dg:\n");
while (mdump != NULL) {
dump_buf(mtod(mdump, caddr_t), mdump->m_len);
mdump = mdump->m_next;
}
- ENDDEBUG
+ }
+#endif
error = SN_OUTPUT(clcp, m);
goto done;
* Too large for interface; fragment if possible.
*/
error = clnp_fragment(clcp->clc_ifp, m, clcp->clc_firsthop,
- total_len, clcp->clc_segoff, flags, clcp->clc_rt);
+ total_len, clcp->clc_segoff, flags, clcp->clc_rt);
goto done;
}
bad:
return (error);
}
-int clnp_ctloutput()
+void
+clnp_ctloutput()
{
}
-/* $NetBSD: clnp_raw.c,v 1.8 1995/08/17 02:57:30 mycroft Exp $ */
+/* $OpenBSD: clnp_raw.c,v 1.2 1996/03/04 10:34:59 mickey Exp $ */
+/* $NetBSD: clnp_raw.c,v 1.9 1996/02/13 22:08:42 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
#include <sys/socketvar.h>
#include <sys/errno.h>
#include <sys/time.h>
+#include <sys/systm.h>
#include <net/if.h>
#include <net/route.h>
#include <netiso/clnp_stat.h>
#include <netiso/argo_debug.h>
-#include <netiso/tp_user.h> /* XXX -- defines SOL_NETWORK */
+#include <netiso/tp_user.h> /* XXX -- defines SOL_NETWORK */
-struct sockproto rclnp_proto = { PF_ISO, 0 };
+#include <machine/stdarg.h>
+
+struct sockproto rclnp_proto = {PF_ISO, 0};
/*
* FUNCTION: rclnp_input
*
- * PURPOSE: Setup generic address an protocol structures for
- * raw input routine, then pass them along with the
- * mbuf chain.
+ * PURPOSE: Setup generic address an protocol structures for
+ * raw input routine, then pass them along with the
+ * mbuf chain.
*
- * RETURNS: none
+ * RETURNS: none
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES: The protocol field of rclnp_proto is set to zero indicating
- * no protocol.
+ * NOTES: The protocol field of rclnp_proto is set to zero
+ * indicating no protocol.
*/
void
-rclnp_input(m, src, dst, hdrlen)
-struct mbuf *m; /* ptr to packet */
-struct sockaddr_iso *src; /* ptr to src address */
-struct sockaddr_iso *dst; /* ptr to dest address */
-int hdrlen; /* length (in bytes) of clnp header */
+#if __STDC__
+rclnp_input(struct mbuf *m, ...)
+#else
+rclnp_input(m, va_alist)
+ struct mbuf *m; /* ptr to packet */
+ va_dcl
+#endif
{
+ struct sockaddr_iso *src; /* ptr to src address */
+ struct sockaddr_iso *dst; /* ptr to dest address */
+ int hdrlen; /* length (in bytes) of clnp header */
+ va_list ap;
+
+ va_start(ap, m);
+ src = va_arg(ap, struct sockaddr_iso *);
+ dst = va_arg(ap, struct sockaddr_iso *);
+ hdrlen = va_arg(ap, int);
+ va_end(ap);
#ifdef TROLL
if (trollctl.tr_ops & TR_CHUCK) {
m_freem(m);
return;
}
-#endif /* TROLL */
+#endif /* TROLL */
raw_input(m, &rclnp_proto, sisotosa(src), sisotosa(dst));
}
* RETURNS: success - 0
* failure - an appropriate error code
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
*/
-rclnp_output(m0, so)
-struct mbuf *m0; /* packet to send */
-struct socket *so; /* socket to send from */
+int
+#if __STDC__
+rclnp_output(struct mbuf *m0, ...)
+#else
+rclnp_output(m0, va_alist)
+ struct mbuf *m0; /* packet to send */
+ va_dcl
+#endif
{
- register struct mbuf *m; /* used to scan a chain */
- int len = 0; /* store length of chain here */
- struct rawisopcb *rp = sotorawisopcb(so); /* ptr to raw cb */
- int error; /* return value of function */
- int flags; /* flags for clnp_output */
+ struct socket *so; /* socket to send from */
+ struct rawisopcb *rp; /* ptr to raw cb */
+ int error; /* return value of function */
+ int flags; /* flags for clnp_output */
+ va_list ap;
+
+ va_start(ap, m0);
+ so = va_arg(ap, struct socket *);
+ va_end(ap);
+ rp = sotorawisopcb(so);
- if (0 == (m0->m_flags & M_PKTHDR))
+ if ((m0->m_flags & M_PKTHDR) == 0)
return (EINVAL);
/*
- * Set up src address. If user has bound socket to an address, use it.
- * Otherwise, do not specify src (clnp_output will fill it in).
+ * Set up src address. If user has bound socket to an address, use it.
+ * Otherwise, do not specify src (clnp_output will fill it in).
*/
if (rp->risop_rcb.rcb_laddr) {
if (rp->risop_isop.isop_sladdr.siso_family != AF_ISO) {
-bad:
+ bad:
m_freem(m0);
- return(EAFNOSUPPORT);
+ return (EAFNOSUPPORT);
}
}
/* set up dest address */
flags = rp->risop_flags & CLNP_VFLAGS;
error = clnp_output(m0, &rp->risop_isop, m0->m_pkthdr.len,
- flags|CLNP_NOCACHE);
+ flags | CLNP_NOCACHE);
return (error);
}
* FUNCTION: rclnp_ctloutput
*
* PURPOSE: Raw clnp socket option processing
- * All options are stored inside an mbuf.
+ * All options are stored inside an mbuf.
*
* RETURNS: success - 0
* failure - unix error code
* SIDE EFFECTS: If the options mbuf does not exist, it the mbuf passed
* is used.
*
- * NOTES:
+ * NOTES:
*/
+int
rclnp_ctloutput(op, so, level, optname, m)
-int op; /* type of operation */
-struct socket *so; /* ptr to socket */
-int level; /* level of option */
-int optname; /* name of option */
-struct mbuf **m; /* ptr to ptr to option data */
+ int op; /* type of operation */
+ struct socket *so; /* ptr to socket */
+ int level; /* level of option */
+ int optname;/* name of option */
+ struct mbuf **m; /* ptr to ptr to option data */
{
- int error = 0;
- register struct rawisopcb *rp = sotorawisopcb(so);/* raw cb ptr */
+ int error = 0;
+ register struct rawisopcb *rp = sotorawisopcb(so); /* raw cb ptr */
- IFDEBUG(D_CTLOUTPUT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CTLOUTPUT]) {
printf("rclnp_ctloutput: op = x%x, level = x%x, name = x%x\n",
- op, level, optname);
+ op, level, optname);
if (*m != NULL) {
printf("rclnp_ctloutput: %d bytes of mbuf data\n", (*m)->m_len);
dump_buf(mtod((*m), caddr_t), (*m)->m_len);
}
- ENDDEBUG
+ }
+#endif
#ifdef SOL_NETWORK
if (level != SOL_NETWORK)
error = EINVAL;
- else switch (op) {
+ else
+ switch (op) {
#else
switch (op) {
-#endif /* SOL_NETWORK */
- case PRCO_SETOPT:
- switch (optname) {
- case CLNPOPT_FLAGS: {
- u_short usr_flags;
- /*
- * Insure that the data passed has exactly one short in it
- */
- if ((*m == NULL) || ((*m)->m_len != sizeof(short))) {
- error = EINVAL;
- break;
- }
-
- /*
- * Don't allow invalid flags to be set
- */
- usr_flags = (*mtod((*m), short *));
-
- if ((usr_flags & (CLNP_VFLAGS)) != usr_flags) {
- error = EINVAL;
- } else
- rp->risop_flags |= usr_flags;
-
- } break;
-
- case CLNPOPT_OPTS:
- if (error = clnp_set_opts(&rp->risop_isop.isop_options, m))
- break;
- rp->risop_isop.isop_optindex = m_get(M_WAIT, MT_SOOPTS);
- (void) clnp_opt_sanity(rp->risop_isop.isop_options,
- mtod(rp->risop_isop.isop_options, caddr_t),
- rp->risop_isop.isop_options->m_len,
- mtod(rp->risop_isop.isop_optindex,
- struct clnp_optidx *));
+#endif /* SOL_NETWORK */
+ case PRCO_SETOPT:
+ switch (optname) {
+ case CLNPOPT_FLAGS:{
+ u_short usr_flags;
+ /*
+ * Insure that the data passed has exactly
+ * one short in it
+ */
+ if ((*m == NULL) || ((*m)->m_len != sizeof(short))) {
+ error = EINVAL;
break;
- }
- break;
+ }
+ /*
+ * Don't allow invalid flags to be set
+ */
+ usr_flags = (*mtod((*m), short *));
- case PRCO_GETOPT:
-#ifdef notdef
- /* commented out to keep hi C quiet */
- switch (optname) {
- default:
+ if ((usr_flags & (CLNP_VFLAGS)) != usr_flags) {
error = EINVAL;
- break;
- }
-#endif /* notdef */
+ } else
+ rp->risop_flags |= usr_flags;
+
+ } break;
+
+ case CLNPOPT_OPTS:
+ error = clnp_set_opts(&rp->risop_isop.isop_options, m);
+ if (error)
+ break;
+ rp->risop_isop.isop_optindex = m_get(M_WAIT, MT_SOOPTS);
+ (void) clnp_opt_sanity(rp->risop_isop.isop_options,
+ mtod(rp->risop_isop.isop_options, caddr_t),
+ rp->risop_isop.isop_options->m_len,
+ mtod(rp->risop_isop.isop_optindex,
+ struct clnp_optidx *));
break;
+ }
+ break;
+
+ case PRCO_GETOPT:
+#ifdef notdef
+ /* commented out to keep hi C quiet */
+ switch (optname) {
default:
error = EINVAL;
break;
+ }
+#endif /* notdef */
+ break;
+ default:
+ error = EINVAL;
+ break;
}
if (op == PRCO_SETOPT) {
/* note: m_freem does not barf is *m is NULL */
m_freem(*m);
*m = NULL;
}
-
return error;
}
-/*ARGSUSED*/
+/* ARGSUSED */
+int
clnp_usrreq(so, req, m, nam, control)
register struct socket *so;
- int req;
- struct mbuf *m, *nam, *control;
+ int req;
+ struct mbuf *m, *nam, *control;
{
- register int error = 0;
+ register int error = 0;
register struct rawisopcb *rp = sotorawisopcb(so);
rp = sotorawisopcb(so);
MALLOC(rp, struct rawisopcb *, sizeof *rp, M_PCB, M_WAITOK);
if (rp == 0)
return (ENOBUFS);
- bzero((caddr_t)rp, sizeof *rp);
+ bzero(rp, sizeof *rp);
so->so_pcb = rp;
break;
rp->risop_rcb.rcb_laddr = 0;
/* free clnp cached hdr if necessary */
if (rp->risop_isop.isop_clnpcache != NULL) {
- struct clnp_cache *clcp =
- mtod(rp->risop_isop.isop_clnpcache, struct clnp_cache *);
+ struct clnp_cache *clcp =
+ mtod(rp->risop_isop.isop_clnpcache, struct clnp_cache *);
if (clcp->clc_hdr != NULL) {
m_free(clcp->clc_hdr);
}
break;
case PRU_BIND:
- {
- struct sockaddr_iso *addr = mtod(nam, struct sockaddr_iso *);
-
- if (nam->m_len != sizeof(*addr))
- return (EINVAL);
- if ((ifnet.tqh_first == 0) ||
- (addr->siso_family != AF_ISO) ||
- (addr->siso_addr.isoa_len &&
- ifa_ifwithaddr(sisotosa(addr)) == 0))
- return (EADDRNOTAVAIL);
- rp->risop_isop.isop_sladdr = *addr;
- rp->risop_rcb.rcb_laddr = sisotosa(
- (rp->risop_isop.isop_laddr = &rp->risop_isop.isop_sladdr));
- return (0);
- }
+ {
+ struct sockaddr_iso *addr = mtod(nam, struct sockaddr_iso *);
+
+ if (nam->m_len != sizeof(*addr))
+ return (EINVAL);
+ if ((ifnet.tqh_first == 0) ||
+ (addr->siso_family != AF_ISO) ||
+ (addr->siso_addr.isoa_len &&
+ ifa_ifwithaddr(sisotosa(addr)) == 0))
+ return (EADDRNOTAVAIL);
+ rp->risop_isop.isop_sladdr = *addr;
+ rp->risop_rcb.rcb_laddr = sisotosa(
+ (rp->risop_isop.isop_laddr = &rp->risop_isop.isop_sladdr));
+ return (0);
+ }
case PRU_CONNECT:
- {
- struct sockaddr_iso *addr = mtod(nam, struct sockaddr_iso *);
-
- if ((nam->m_len > sizeof(*addr)) || (addr->siso_len > sizeof(*addr)))
- return (EINVAL);
- if (ifnet.tqh_first == 0)
- return (EADDRNOTAVAIL);
- if (addr->siso_family != AF_ISO)
- rp->risop_isop.isop_sfaddr = *addr;
- rp->risop_rcb.rcb_faddr = sisotosa(
- (rp->risop_isop.isop_faddr = &rp->risop_isop.isop_sfaddr));
- soisconnected(so);
- return (0);
- }
+ {
+ struct sockaddr_iso *addr = mtod(nam, struct sockaddr_iso *);
+
+ if ((nam->m_len > sizeof(*addr)) || (addr->siso_len > sizeof(*addr)))
+ return (EINVAL);
+ if (ifnet.tqh_first == 0)
+ return (EADDRNOTAVAIL);
+ if (addr->siso_family != AF_ISO)
+ rp->risop_isop.isop_sfaddr = *addr;
+ rp->risop_rcb.rcb_faddr = sisotosa(
+ (rp->risop_isop.isop_faddr = &rp->risop_isop.isop_sfaddr));
+ soisconnected(so);
+ return (0);
+ }
}
- error = raw_usrreq(so, req, m, nam, control);
+ error = raw_usrreq(so, req, m, nam, control);
if (error && req == PRU_ATTACH && so->so_pcb)
- free((caddr_t)rp, M_PCB);
+ free((caddr_t) rp, M_PCB);
return (error);
}
-/* $NetBSD: clnp_stat.h,v 1.5 1994/06/29 06:39:18 cgd Exp $ */
+/* $OpenBSD: clnp_stat.h,v 1.2 1996/03/04 10:35:01 mickey Exp $ */
+/* $NetBSD: clnp_stat.h,v 1.6 1996/02/13 22:08:46 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
#define _NETISO_CLNP_STAT_H_
struct clnp_stat {
- int cns_total; /* total pkts received */
- int cns_toosmall; /* fixed part of header too small */
- int cns_badhlen; /* header length is not reasonable */
- int cns_badcsum; /* checksum on packet failed */
- int cns_badaddr; /* address fields were not reasonable */
- int cns_badvers; /* incorrect version */
- int cns_noseg; /* segment information forgotten */
- int cns_noproto; /* incorrect protocol id */
- int cns_delivered; /* packets consumed by protocol */
- int cns_ttlexpired; /* ttl has expired */
- int cns_forward; /* forwarded packets */
- int cns_sent; /* total packets sent */
- int cns_odropped; /* o.k. packets discarded, e.g. ENOBUFS */
- int cns_cantforward; /* non-forwarded packets */
- int cns_fragmented; /* packets fragmented */
- int cns_fragments; /* fragments received */
- int cns_fragdropped; /* fragments discarded */
- int cns_fragtimeout; /* fragments timed out */
- int cns_ofragments; /* fragments generated */
- int cns_cantfrag; /* fragmentation prohibited */
- int cns_reassembled; /* packets reconstructed */
- int cns_cachemiss; /* cache misses */
- int cns_congest_set; /* congestion experienced bit set */
- int cns_congest_rcvd; /* congestion experienced bit received */
- int cns_er_inhist[CLNP_ERRORS + 1];
- int cns_er_outhist[CLNP_ERRORS + 1];
-} clnp_stat ;
+ int cns_total; /* total pkts received */
+ int cns_toosmall; /* fixed part of header too small */
+ int cns_badhlen; /* header length is not reasonable */
+ int cns_badcsum; /* checksum on packet failed */
+ int cns_badaddr; /* address fields were not reasonable */
+ int cns_badvers; /* incorrect version */
+ int cns_noseg; /* segment information forgotten */
+ int cns_noproto; /* incorrect protocol id */
+ int cns_delivered; /* packets consumed by protocol */
+ int cns_ttlexpired; /* ttl has expired */
+ int cns_forward; /* forwarded packets */
+ int cns_sent; /* total packets sent */
+ int cns_odropped; /* o.k. packets discarded, e.g.
+ * ENOBUFS */
+ int cns_cantforward; /* non-forwarded packets */
+ int cns_fragmented; /* packets fragmented */
+ int cns_fragments; /* fragments received */
+ int cns_fragdropped; /* fragments discarded */
+ int cns_fragtimeout; /* fragments timed out */
+ int cns_ofragments; /* fragments generated */
+ int cns_cantfrag; /* fragmentation prohibited */
+ int cns_reassembled; /* packets reconstructed */
+ int cns_cachemiss; /* cache misses */
+ int cns_congest_set; /* congestion experienced bit
+ * set */
+ int cns_congest_rcvd; /* congestion experienced bit
+ * received */
+ int cns_er_inhist[CLNP_ERRORS + 1];
+ int cns_er_outhist[CLNP_ERRORS + 1];
+} clnp_stat;
#ifdef INCSTAT
#undef INCSTAT
-#endif /* INCSTAT */
+#endif /* INCSTAT */
#define INCSTAT(x) clnp_stat./**/x/**/++
-#endif /* _NETISO_CLNP_STAT_H_ */
+#endif /* _NETISO_CLNP_STAT_H_ */
-/* $NetBSD: clnp_subr.c,v 1.6 1995/06/13 07:13:22 mycroft Exp $ */
+/* $OpenBSD: clnp_subr.c,v 1.2 1996/03/04 10:35:02 mickey Exp $ */
+/* $NetBSD: clnp_subr.c,v 1.7 1996/02/13 22:08:49 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
#include <sys/socketvar.h>
#include <sys/errno.h>
#include <sys/time.h>
+#include <sys/systm.h>
#include <net/if.h>
#include <net/route.h>
#include <netiso/clnp.h>
#include <netiso/clnp_stat.h>
#include <netiso/argo_debug.h>
+#include <netiso/esis.h>
/*
* FUNCTION: clnp_data_ck
*
- * PURPOSE: Check that the amount of data in the mbuf chain is
- * at least as much as the clnp header would have us
- * expect. Trim mbufs if longer than expected, drop
- * packet if shorter than expected.
+ * PURPOSE: Check that the amount of data in the mbuf chain is
+ * at least as much as the clnp header would have us
+ * expect. Trim mbufs if longer than expected, drop
+ * packet if shorter than expected.
*
- * RETURNS: success - ptr to mbuf chain
- * failure - 0
+ * RETURNS: success - ptr to mbuf chain
+ * failure - 0
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
*/
-struct mbuf *
+struct mbuf *
clnp_data_ck(m, length)
-register struct mbuf *m; /* ptr to mbuf chain containing hdr & data */
-int length; /* length (in bytes) of packet */
- {
- register int len; /* length of data */
- register struct mbuf *mhead; /* ptr to head of chain */
+ register struct mbuf *m;/* ptr to mbuf chain containing hdr & data */
+ int length; /* length (in bytes) of packet */
+{
+ register int len; /* length of data */
+ register struct mbuf *mhead; /* ptr to head of chain */
len = -length;
mhead = m;
/*
* FUNCTION: clnp_extract_addr
*
- * PURPOSE: Extract the source and destination address from the
- * supplied buffer. Place them in the supplied address buffers.
- * If insufficient data is supplied, then fail.
+ * PURPOSE: Extract the source and destination address from the
+ * supplied buffer. Place them in the supplied address buffers.
+ * If insufficient data is supplied, then fail.
*
- * RETURNS: success - Address of first byte in the packet past
- * the address part.
- * failure - 0
+ * RETURNS: success - Address of first byte in the packet past
+ * the address part.
+ * failure - 0
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
*/
caddr_t
clnp_extract_addr(bufp, buflen, srcp, destp)
-caddr_t bufp; /* ptr to buffer containing addresses */
-int buflen; /* length of buffer */
-register struct iso_addr *srcp; /* ptr to source address buffer */
-register struct iso_addr *destp; /* ptr to destination address buffer */
- {
- int len; /* argument to bcopy */
-
- /*
- * check that we have enough data. Plus1 is for length octet
+ caddr_t bufp; /* ptr to buffer containing addresses */
+ int buflen; /* length of buffer */
+ register struct iso_addr *srcp; /* ptr to source address buffer */
+ register struct iso_addr *destp; /* ptr to destination address
+ * buffer */
+{
+ int len; /* argument to bcopy */
+
+ /*
+ * check that we have enough data. Plus1 is for length octet
*/
- if ((u_char)*bufp + 1 > buflen) {
- return((caddr_t)0);
+ if ((u_char) * bufp + 1 > buflen) {
+ return ((caddr_t) 0);
}
- len = destp->isoa_len = (u_char)*bufp++;
- (void) bcopy(bufp, (caddr_t)destp, len);
+ len = destp->isoa_len = (u_char) * bufp++;
+ (void) bcopy(bufp, (caddr_t) destp, len);
buflen -= len;
bufp += len;
- /*
- * check that we have enough data. Plus1 is for length octet
+ /*
+ * check that we have enough data. Plus1 is for length octet
*/
- if ((u_char)*bufp + 1 > buflen) {
- return((caddr_t)0);
+ if ((u_char) * bufp + 1 > buflen) {
+ return ((caddr_t) 0);
}
- len = srcp->isoa_len = (u_char)* bufp++;
- (void) bcopy(bufp, (caddr_t)srcp, len);
+ len = srcp->isoa_len = (u_char) * bufp++;
+ (void) bcopy(bufp, (caddr_t) srcp, len);
bufp += len;
/*
else
return (caddr_t) 0;
}
-#endif /* notdef */
+#endif /* notdef */
/*
* FUNCTION: clnp_ours
*
- * PURPOSE: Decide whether the supplied packet is destined for
- * us, or that it should be forwarded on.
+ * PURPOSE: Decide whether the supplied packet is destined for
+ * us, or that it should be forwarded on.
*
- * RETURNS: packet is for us - 1
- * packet is not for us - 0
+ * RETURNS: packet is for us - 1
+ * packet is not for us - 0
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
*/
+int
clnp_ours(dst)
-register struct iso_addr *dst; /* ptr to destination address */
+ register struct iso_addr *dst; /* ptr to destination address */
{
register struct iso_ifaddr *ia; /* scan through interface addresses */
for (ia = iso_ifaddr.tqh_first; ia != 0; ia = ia->ia_list.tqe_next) {
- IFDEBUG(D_ROUTE)
- printf("clnp_ours: ia_sis x%x, dst x%x\n", &ia->ia_addr,
- dst);
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ROUTE]) {
+ printf("clnp_ours: ia_sis x%x, dst x%x\n",
+ (unsigned int) &ia->ia_addr,
+ (unsigned int) dst);
+ }
+#endif
/*
* XXX Warning:
* We are overloading siso_tlen in the if's address, as an nsel length.
*/
if (dst->isoa_len == ia->ia_addr.siso_nlen &&
- bcmp((caddr_t)ia->ia_addr.siso_addr.isoa_genaddr,
- (caddr_t)dst->isoa_genaddr,
- ia->ia_addr.siso_nlen - ia->ia_addr.siso_tlen) == 0)
- return 1;
+ bcmp((caddr_t) ia->ia_addr.siso_addr.isoa_genaddr,
+ (caddr_t) dst->isoa_genaddr,
+ ia->ia_addr.siso_nlen - ia->ia_addr.siso_tlen) == 0)
+ return 1;
}
return 0;
}
/* Dec bit set if ifp qlen is greater than congest_threshold */
-int congest_threshold = 0;
+int congest_threshold = 0;
/*
* FUNCTION: clnp_forward
*
- * PURPOSE: Forward the datagram passed
- * clnpintr guarantees that the header will be
- * contigious (a cluster mbuf will be used if necessary).
+ * PURPOSE: Forward the datagram passed
+ * clnpintr guarantees that the header will be
+ * contigious (a cluster mbuf will be used if necessary).
*
- * If oidx is NULL, no options are present.
+ * If oidx is NULL, no options are present.
*
- * RETURNS: nothing
+ * RETURNS: nothing
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
*/
+void
clnp_forward(m, len, dst, oidx, seg_off, inbound_shp)
-struct mbuf *m; /* pkt to forward */
-int len; /* length of pkt */
-struct iso_addr *dst; /* destination address */
-struct clnp_optidx *oidx; /* option index */
-int seg_off;/* offset of segmentation part */
-struct snpa_hdr *inbound_shp; /* subnetwork header of inbound packet */
+ struct mbuf *m; /* pkt to forward */
+ int len; /* length of pkt */
+ struct iso_addr *dst; /* destination address */
+ struct clnp_optidx *oidx; /* option index */
+ int seg_off;/* offset of segmentation part */
+ struct snpa_hdr *inbound_shp; /* subnetwork header of inbound
+ * packet */
{
- struct clnp_fixed *clnp; /* ptr to fixed part of header */
- int error; /* return value of route function */
- struct sockaddr *next_hop; /* next hop for dgram */
- struct ifnet *ifp; /* ptr to outgoing interface */
- struct iso_ifaddr *ia = 0;/* ptr to iso name for ifp */
- struct route_iso route; /* filled in by clnp_route */
- extern int iso_systype;
+ struct clnp_fixed *clnp;/* ptr to fixed part of header */
+ int error; /* return value of route function */
+ struct sockaddr *next_hop; /* next hop for dgram */
+ struct ifnet *ifp; /* ptr to outgoing interface */
+ struct iso_ifaddr *ia = 0; /* ptr to iso name for ifp */
+ struct route_iso route; /* filled in by clnp_route */
+ extern int iso_systype;
clnp = mtod(m, struct clnp_fixed *);
- bzero((caddr_t)&route, sizeof(route)); /* MUST be done before "bad:" */
+ bzero((caddr_t) & route, sizeof(route)); /* MUST be done before
+ * "bad:" */
/*
* Don't forward multicast or broadcast packets
*/
if ((inbound_shp) && (IS_MULTICAST(inbound_shp->snh_dhost))) {
- IFDEBUG(D_FORWARD)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_FORWARD]) {
printf("clnp_forward: dropping multicast packet\n");
- ENDDEBUG
- clnp->cnf_type &= ~CNF_ERR_OK; /* so we don't generate an ER */
+ }
+#endif
+ clnp->cnf_type &= ~CNF_ERR_OK; /* so we don't generate an ER */
clnp_discard(m, 0);
INCSTAT(cns_cantforward);
goto done;
}
-
- IFDEBUG(D_FORWARD)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_FORWARD]) {
printf("clnp_forward: %d bytes, to %s, options x%x\n", len,
- clnp_iso_addrp(dst), oidx);
- ENDDEBUG
+ clnp_iso_addrp(dst), (unsigned int) oidx);
+ }
+#endif
/*
* Decrement ttl, and if zero drop datagram
* Can't compare ttl as less than zero 'cause its a unsigned
*/
if ((clnp->cnf_ttl == 0) || (--clnp->cnf_ttl == 0)) {
- IFDEBUG(D_FORWARD)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_FORWARD]) {
printf("clnp_forward: discarding datagram because ttl is zero\n");
- ENDDEBUG
+ }
+#endif
INCSTAT(cns_ttlexpired);
clnp_discard(m, TTL_EXPTRANSIT);
goto done;
/*
* Route packet; special case for source rt
*/
- if CLNPSRCRT_VALID(oidx) {
+ if CLNPSRCRT_VALID
+ (oidx) {
/*
* Update src route first
*/
error = clnp_route(dst, &route, 0, &next_hop, &ia);
}
if (error || ia == 0) {
- IFDEBUG(D_FORWARD)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_FORWARD]) {
printf("clnp_forward: can't route packet (errno %d)\n", error);
- ENDDEBUG
+ }
+#endif
clnp_discard(m, ADDR_DESTUNREACH);
INCSTAT(cns_cantforward);
goto done;
}
ifp = ia->ia_ifp;
- IFDEBUG(D_FORWARD)
- printf("clnp_forward: packet routed to %s\n",
- clnp_iso_addrp(&satosiso(next_hop)->siso_addr));
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_FORWARD]) {
+ printf("clnp_forward: packet routed to %s\n",
+ clnp_iso_addrp(&satosiso(next_hop)->siso_addr));
+ }
+#endif
INCSTAT(cns_forward);
/*
* If we are an intermediate system and
* we are routing outbound on the same ifp that the packet
- * arrived upon, and we know the next hop snpa,
+ * arrived upon, and we know the next hop snpa,
* then generate a redirect request
*/
- if ((iso_systype & SNPA_IS) && (inbound_shp) &&
- (ifp == inbound_shp->snh_ifp))
- esis_rdoutput(inbound_shp, m, oidx, dst, route.ro_rt);
+ if ((iso_systype & SNPA_IS) && (inbound_shp) &&
+ (ifp == inbound_shp->snh_ifp))
+ esis_rdoutput(inbound_shp, m, oidx, dst, route.ro_rt);
/*
* If options are present, update them
*/
if (oidx) {
- struct iso_addr *mysrc = &ia->ia_addr.siso_addr;
+ struct iso_addr *mysrc = &ia->ia_addr.siso_addr;
if (mysrc == NULL) {
clnp_discard(m, ADDR_DESTUNREACH);
INCSTAT(cns_cantforward);
(void) clnp_dooptions(m, oidx, ifp, mysrc);
}
}
-
#ifdef DECBIT
if (ifp->if_snd.ifq_len > congest_threshold) {
/*
* Congestion! Set the Dec Bit and thank Dave Oran
*/
- IFDEBUG(D_FORWARD)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_FORWARD]) {
printf("clnp_forward: congestion experienced\n");
- ENDDEBUG
+ }
+#endif
if ((oidx) && (oidx->cni_qos_formatp)) {
- caddr_t qosp = CLNP_OFFTOOPT(m, oidx->cni_qos_formatp);
- u_char qos = *qosp;
- IFDEBUG(D_FORWARD)
+ caddr_t qosp = CLNP_OFFTOOPT(m, oidx->cni_qos_formatp);
+ u_char qos = *qosp;
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_FORWARD]) {
printf("clnp_forward: setting congestion bit (qos x%x)\n", qos);
- ENDDEBUG
+ }
+#endif
if ((qos & CLNPOVAL_GLOBAL) == CLNPOVAL_GLOBAL) {
qos |= CLNPOVAL_CONGESTED;
INCSTAT(cns_congest_set);
}
}
}
-#endif /* DECBIT */
-
+#endif /* DECBIT */
+
/*
* Dispatch the datagram if it is small enough, otherwise fragment
*/
if (len <= SN_MTU(ifp, route.ro_rt)) {
- iso_gen_csum(m, CLNP_CKSUM_OFF, (int)clnp->cnf_hdr_len);
- (void) (*ifp->if_output)(ifp, m, next_hop, route.ro_rt);
+ iso_gen_csum(m, CLNP_CKSUM_OFF, (int) clnp->cnf_hdr_len);
+ (void) (*ifp->if_output) (ifp, m, next_hop, route.ro_rt);
} else {
- (void) clnp_fragment(ifp, m, next_hop, len, seg_off, /* flags */0, route.ro_rt);
+ (void) clnp_fragment(ifp, m, next_hop, len, seg_off, /* flags */ 0, route.ro_rt);
}
-
+
done:
/*
* Free route
*
* RETURNS: Address of first byte after address part in datagram.
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
* NOTES: Assume that there is enough space for the address part.
*/
caddr_t
clnp_insert_addr(bufp, srcp, dstp)
-caddr_t bufp; /* address of where addr part goes */
-register struct iso_addr *srcp; /* ptr to src addr */
-register struct iso_addr *dstp; /* ptr to dst addr */
+ caddr_t bufp; /* address of where addr part goes */
+ register struct iso_addr *srcp; /* ptr to src addr */
+ register struct iso_addr *dstp; /* ptr to dst addr */
{
*bufp++ = dstp->isoa_len;
- (void) bcopy((caddr_t)dstp, bufp, dstp->isoa_len);
+ (void) bcopy((caddr_t) dstp, bufp, dstp->isoa_len);
bufp += dstp->isoa_len;
*bufp++ = srcp->isoa_len;
- (void) bcopy((caddr_t)srcp, bufp, srcp->isoa_len);
+ (void) bcopy((caddr_t) srcp, bufp, srcp->isoa_len);
bufp += srcp->isoa_len;
return bufp;
}
-#endif /* notdef */
+#endif /* notdef */
/*
* FUNCTION: clnp_route
*
- * PURPOSE: Route a clnp datagram to the first hop toward its
- * destination. In many cases, the first hop will be
- * the destination. The address of a route
- * is specified. If a routing entry is present in
- * that route, and it is still up to the same destination,
- * then no further action is necessary. Otherwise, a
- * new routing entry will be allocated.
+ * PURPOSE: Route a clnp datagram to the first hop toward its
+ * destination. In many cases, the first hop will be
+ * the destination. The address of a route
+ * is specified. If a routing entry is present in
+ * that route, and it is still up to the same destination,
+ * then no further action is necessary. Otherwise, a
+ * new routing entry will be allocated.
*
- * RETURNS: route found - 0
- * unix error code
+ * RETURNS: route found - 0
+ * unix error code
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES: It is up to the caller to free the routing entry
- * allocated in route.
+ * NOTES: It is up to the caller to free the routing entry
+ * allocated in route.
*/
+int
clnp_route(dst, ro, flags, first_hop, ifa)
- struct iso_addr *dst; /* ptr to datagram destination */
- register struct route_iso *ro; /* existing route structure */
- int flags; /* flags for routing */
- struct sockaddr **first_hop; /* result: fill in with ptr to firsthop */
- struct iso_ifaddr **ifa; /* result: fill in with ptr to interface */
+ struct iso_addr *dst; /* ptr to datagram destination */
+ register struct route_iso *ro; /* existing route structure */
+ int flags; /* flags for routing */
+ struct sockaddr **first_hop; /* result: fill in with ptr to
+ * firsthop */
+ struct iso_ifaddr **ifa;/* result: fill in with ptr to interface */
{
if (flags & SO_DONTROUTE) {
struct iso_ifaddr *ia;
RTFREE(ro->ro_rt);
ro->ro_rt = 0;
}
- bzero((caddr_t)&ro->ro_dst, sizeof(ro->ro_dst));
- bcopy((caddr_t)dst, (caddr_t)&ro->ro_dst.siso_addr,
- 1 + (unsigned)dst->isoa_len);
+ bzero((caddr_t) & ro->ro_dst, sizeof(ro->ro_dst));
+ bcopy((caddr_t) dst, (caddr_t) & ro->ro_dst.siso_addr,
+ 1 + (unsigned) dst->isoa_len);
ro->ro_dst.siso_family = AF_ISO;
ro->ro_dst.siso_len = sizeof(ro->ro_dst);
ia = iso_localifa(&ro->ro_dst);
* the same destination. If not, free it and try again.
*/
if (ro->ro_rt && ((ro->ro_rt->rt_flags & RTF_UP) == 0 ||
- (Bcmp(ro->ro_dst.siso_data, dst->isoa_genaddr, dst->isoa_len)))) {
- IFDEBUG(D_ROUTE)
+ (Bcmp(ro->ro_dst.siso_data, dst->isoa_genaddr, dst->isoa_len)))) {
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ROUTE]) {
printf("clnp_route: freeing old route: ro->ro_rt 0x%x\n",
- ro->ro_rt);
+ (unsigned int) ro->ro_rt);
printf("clnp_route: old route refcnt: 0x%x\n",
- ro->ro_rt->rt_refcnt);
- ENDDEBUG
+ ro->ro_rt->rt_refcnt);
+ }
+#endif
/* free old route entry */
RTFREE(ro->ro_rt);
- ro->ro_rt = (struct rtentry *)0;
+ ro->ro_rt = (struct rtentry *) 0;
} else {
- IFDEBUG(D_ROUTE)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ROUTE]) {
printf("clnp_route: OK route exists\n");
- ENDDEBUG
+ }
+#endif
}
if (ro->ro_rt == 0) {
/* set up new route structure */
- bzero((caddr_t)&ro->ro_dst, sizeof(ro->ro_dst));
+ bzero((caddr_t) & ro->ro_dst, sizeof(ro->ro_dst));
ro->ro_dst.siso_len = sizeof(ro->ro_dst);
ro->ro_dst.siso_family = AF_ISO;
Bcopy(dst, &ro->ro_dst.siso_addr, 1 + dst->isoa_len);
/* allocate new route */
- IFDEBUG(D_ROUTE)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ROUTE]) {
printf("clnp_route: allocating new route to %s\n",
- clnp_iso_addrp(dst));
- ENDDEBUG
- rtalloc((struct route *)ro);
+ clnp_iso_addrp(dst));
+ }
+#endif
+ rtalloc((struct route *) ro);
}
if (ro->ro_rt == 0)
- return(ENETUNREACH); /* rtalloc failed */
+ return (ENETUNREACH); /* rtalloc failed */
ro->ro_rt->rt_use++;
if (ifa)
- if ((*ifa = (struct iso_ifaddr *)ro->ro_rt->rt_ifa) == 0)
+ if ((*ifa = (struct iso_ifaddr *) ro->ro_rt->rt_ifa) == 0)
panic("clnp_route");
if (first_hop) {
if (ro->ro_rt->rt_flags & RTF_GATEWAY)
else
*first_hop = sisotosa(&ro->ro_dst);
}
- return(0);
+ return (0);
}
/*
* FUNCTION: clnp_srcroute
*
- * PURPOSE: Source route the datagram. If complete source
- * routing is specified but not possible, then
- * return an error. If src routing is terminated, then
- * try routing on destination.
- * Usage of first_hop,
- * ifp, and error return is identical to clnp_route.
+ * PURPOSE: Source route the datagram. If complete source
+ * routing is specified but not possible, then
+ * return an error. If src routing is terminated, then
+ * try routing on destination.
+ * Usage of first_hop,
+ * ifp, and error return is identical to clnp_route.
*
- * RETURNS: 0 or unix error code
+ * RETURNS: 0 or unix error code
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES: Remember that option index pointers are really
- * offsets from the beginning of the mbuf.
+ * NOTES: Remember that option index pointers are really
+ * offsets from the beginning of the mbuf.
*/
+int
clnp_srcroute(options, oidx, ro, first_hop, ifa, final_dst)
-struct mbuf *options; /* ptr to options */
-struct clnp_optidx *oidx; /* index to options */
-struct route_iso *ro; /* route structure */
-struct sockaddr **first_hop; /* RETURN: fill in with ptr to firsthop */
-struct iso_ifaddr **ifa; /* RETURN: fill in with ptr to interface */
-struct iso_addr *final_dst; /* final destination */
+ struct mbuf *options;/* ptr to options */
+ struct clnp_optidx *oidx; /* index to options */
+ struct route_iso *ro; /* route structure */
+ struct sockaddr **first_hop; /* RETURN: fill in with ptr to
+ * firsthop */
+ struct iso_ifaddr **ifa;/* RETURN: fill in with ptr to interface */
+ struct iso_addr *final_dst; /* final destination */
{
- struct iso_addr dst; /* first hop specified by src rt */
- int error = 0; /* return code */
+ struct iso_addr dst; /* first hop specified by src rt */
+ int error = 0; /* return code */
/*
- * Check if we have run out of routes
+ * Check if we have run out of routes
* If so, then try to route on destination.
*/
- if CLNPSRCRT_TERM(oidx, options) {
+ if CLNPSRCRT_TERM
+ (oidx, options) {
dst.isoa_len = final_dst->isoa_len;
bcopy(final_dst->isoa_genaddr, dst.isoa_genaddr, dst.isoa_len);
} else {
error = clnp_route(&dst, ro, 0, first_hop, ifa);
if (error != 0)
return error;
-
+
/*
* If complete src rt, first hop must be equal to dst
*/
if ((CLNPSRCRT_TYPE(oidx, options) == CLNPOVAL_COMPRT) &&
- (!iso_addrmatch1(&satosiso(*first_hop)->siso_addr, &dst))){
- IFDEBUG(D_OPTIONS)
+ (!iso_addrmatch1(&satosiso(*first_hop)->siso_addr, &dst))) {
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_OPTIONS]) {
printf("clnp_srcroute: complete src route failed\n");
- ENDDEBUG
- return EHOSTUNREACH; /* RAH? would like ESRCRTFAILED */
+ }
+#endif
+ return EHOSTUNREACH; /* RAH? would like ESRCRTFAILED */
}
-
return error;
}
*
* RETURNS: result of clnp_output
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*/
+int
clnp_echoreply(ec_m, ec_len, ec_src, ec_dst, ec_oidxp)
-struct mbuf *ec_m; /* echo request */
-int ec_len; /* length of ec */
-struct sockaddr_iso *ec_src; /* src of ec */
-struct sockaddr_iso *ec_dst; /* destination of ec (i.e., us) */
-struct clnp_optidx *ec_oidxp; /* options index to ec packet */
+ struct mbuf *ec_m; /* echo request */
+ int ec_len; /* length of ec */
+ struct sockaddr_iso *ec_src; /* src of ec */
+ struct sockaddr_iso *ec_dst; /* destination of ec (i.e., us) */
+ struct clnp_optidx *ec_oidxp; /* options index to ec packet */
{
- struct isopcb isopcb;
- int flags = CLNP_NOCACHE|CLNP_ECHOR;
- int ret;
+ struct isopcb isopcb;
+ int flags = CLNP_NOCACHE | CLNP_ECHOR;
+ int ret;
/* fill in fake isopcb to pass to output function */
bzero(&isopcb, sizeof(isopcb));
isopcb.isop_laddr = ec_dst;
isopcb.isop_faddr = ec_src;
- /* forget copying the options for now. If implemented, need only
- * copy record route option, but it must be reset to zero length */
+ /*
+ * forget copying the options for now. If implemented, need only copy
+ * record route option, but it must be reset to zero length
+ */
ret = clnp_output(ec_m, &isopcb, ec_len, flags);
- IFDEBUG(D_OUTPUT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_OUTPUT]) {
printf("clnp_echoreply: output returns %d\n", ret);
- ENDDEBUG
+ }
+#endif
return ret;
}
/*
* FUNCTION: clnp_badmtu
*
- * PURPOSE: print notice of route with mtu not initialized.
+ * PURPOSE: print notice of route with mtu not initialized.
*
- * RETURNS: mtu of ifp.
+ * RETURNS: mtu of ifp.
*
* SIDE EFFECTS: prints notice, slows down system.
*/
+int
clnp_badmtu(ifp, rt, line, file)
-struct ifnet *ifp; /* outgoing interface */
-struct rtentry *rt; /* dst route */
-int line; /* where the dirty deed occured */
-char *file; /* where the dirty deed occured */
+ struct ifnet *ifp; /* outgoing interface */
+ struct rtentry *rt; /* dst route */
+ int line; /* where the dirty deed occured */
+ char *file; /* where the dirty deed occured */
{
printf("sending on route 0x%x with no mtu, line %d of file %s\n",
- rt, line, file);
+ (unsigned int) rt, line, file);
#ifdef ARGO_DEBUG
printf("route dst is ");
- dump_isoaddr(rt_key(rt));
+ dump_isoaddr((struct sockaddr_iso *) rt_key(rt));
#endif
return ifp->if_mtu;
}
/*
* FUNCTION: clnp_ypocb - backwards bcopy
*
- * PURPOSE: bcopy starting at end of src rather than beginning.
+ * PURPOSE: bcopy starting at end of src rather than beginning.
*
- * RETURNS: none
+ * RETURNS: none
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES: No attempt has been made to make this efficient
+ * NOTES: No attempt has been made to make this efficient
*/
+void
clnp_ypocb(from, to, len)
-caddr_t from; /* src buffer */
-caddr_t to; /* dst buffer */
-u_int len; /* number of bytes */
+ caddr_t from; /* src buffer */
+ caddr_t to; /* dst buffer */
+ u_int len; /* number of bytes */
{
while (len--)
*(to + len) = *(from + len);
}
-#endif /* ISO */
+#endif /* ISO */
-/* $NetBSD: clnp_timer.c,v 1.6 1995/08/12 23:59:44 mycroft Exp $ */
+/* $OpenBSD: clnp_timer.c,v 1.2 1996/03/04 10:35:04 mickey Exp $ */
+/* $NetBSD: clnp_timer.c,v 1.7 1996/02/13 22:08:55 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
*
* RETURNS: pointer to next fragment in list of fragments
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
* TODO: send ER back to source
*/
struct clnp_fragl *
clnp_freefrags(cfh)
-register struct clnp_fragl *cfh; /* fragment header to delete */
+ register struct clnp_fragl *cfh; /* fragment header to delete */
{
- struct clnp_fragl *next = cfh->cfl_next;
- struct clnp_frag *cf;
+ struct clnp_fragl *next = cfh->cfl_next;
+ struct clnp_frag *cf;
/* free any frags hanging around */
cf = cfh->cfl_frags;
while (cf != NULL) {
- struct clnp_frag *cf_next = cf->cfr_next;
+ struct clnp_frag *cf_next = cf->cfr_next;
INCSTAT(cns_fragdropped);
m_freem(cf->cfr_data);
cf = cf_next;
if (clnp_frags == cfh) {
clnp_frags = cfh->cfl_next;
} else {
- struct clnp_fragl *scan;
+ struct clnp_fragl *scan;
for (scan = clnp_frags; scan != NULL; scan = scan->cfl_next) {
if (scan->cfl_next == cfh) {
/* free the fragment header */
m_freem(dtom(cfh));
- return(next);
+ return (next);
}
/*
* FUNCTION: clnp_slowtimo
*
- * PURPOSE: clnp timer processing; if the ttl expires on a
+ * PURPOSE: clnp timer processing; if the ttl expires on a
* packet on the reassembly queue, discard it.
*
* RETURNS: none
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
*/
void
clnp_slowtimo()
{
- register struct clnp_fragl *cfh = clnp_frags;
- int s = splsoftnet();
+ register struct clnp_fragl *cfh = clnp_frags;
+ int s = splsoftnet();
while (cfh != NULL) {
if (--cfh->cfl_ttl == 0) {
*
* RETURNS: none
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
* TODO: should send back ER
*/
void
clnp_drain()
{
- register struct clnp_fragl *cfh = clnp_frags;
+ register struct clnp_fragl *cfh = clnp_frags;
while (cfh != NULL)
cfh = clnp_freefrags(cfh);
-/* $NetBSD: cltp_usrreq.c,v 1.8 1995/08/12 23:59:46 mycroft Exp $ */
+/* $OpenBSD: cltp_usrreq.c,v 1.2 1996/03/04 10:35:06 mickey Exp $ */
+/* $NetBSD: cltp_usrreq.c,v 1.9 1996/02/13 22:08:59 christos Exp $ */
/*
* Copyright (c) 1989, 1993
* @(#)cltp_usrreq.c 8.1 (Berkeley) 6/10/93
*/
-#ifndef CLTPOVAL_SRC /* XXX -- till files gets changed */
+#ifndef CLTPOVAL_SRC /* XXX -- till files gets changed */
#include <sys/param.h>
#include <sys/malloc.h>
#include <sys/mbuf.h>
#include <sys/socketvar.h>
#include <sys/errno.h>
#include <sys/stat.h>
+#include <sys/systm.h>
#include <net/if.h>
#include <net/route.h>
#include <netiso/iso_var.h>
#include <netiso/clnp.h>
#include <netiso/cltp_var.h>
+#include <netiso/tp_param.h>
+#include <netiso/tp_var.h>
+
+#include <machine/stdarg.h>
#endif
+
/*
* CLTP protocol implementation.
* Per ISO 8602, December, 1987.
cltb.isop_next = cltb.isop_prev = &cltb;
}
-int cltp_cksum = 1;
+int cltp_cksum = 1;
/* ARGUSED */
void
-cltp_input(m0, srcsa, dstsa, cons_channel, output)
- struct mbuf *m0;
- struct sockaddr *srcsa, *dstsa;
- u_int cons_channel;
- int (*output)();
+#if __STDC__
+cltp_input(struct mbuf *m0, ...)
+#else
+cltp_input(m0, va_alist)
+ struct mbuf *m0;
+ va_dcl
+#endif
{
+ struct sockaddr *srcsa, *dstsa;
+ u_int cons_channel;
register struct isopcb *isop;
register struct mbuf *m = m0;
register u_char *up = mtod(m, u_char *);
- register struct sockaddr_iso *src = satosiso(srcsa);
- int len, hdrlen = *up + 1, dlen = 0;
- u_char *uplim = up + hdrlen;
- caddr_t dtsap;
+ register struct sockaddr_iso *src;
+ int len, hdrlen = *up + 1, dlen = 0;
+ u_char *uplim = up + hdrlen;
+ caddr_t dtsap = NULL;
+ va_list ap;
+
+ va_start(ap, m0);
+ srcsa = va_arg(ap, struct sockaddr *);
+ dstsa = va_arg(ap, struct sockaddr *);
+ cons_channel = va_arg(ap, int);
+ va_end(ap);
+ src = satosiso(srcsa);
for (len = 0; m; m = m->m_next)
len += m->m_len;
- up += 2; /* skip header */
- while (up < uplim) switch (*up) { /* process options */
- case CLTPOVAL_SRC:
- src->siso_tlen = up[1];
- src->siso_len = up[1] + TSEL(src) - (caddr_t)src;
- if (src->siso_len < sizeof(*src))
- src->siso_len = sizeof(*src);
- else if (src->siso_len > sizeof(*src)) {
- MGET(m, M_DONTWAIT, MT_SONAME);
- if (m == 0)
+ up += 2; /* skip header */
+ while (up < uplim)
+ switch (*up) { /* process options */
+ case CLTPOVAL_SRC:
+ src->siso_tlen = up[1];
+ src->siso_len = up[1] + TSEL(src) - (caddr_t) src;
+ if (src->siso_len < sizeof(*src))
+ src->siso_len = sizeof(*src);
+ else if (src->siso_len > sizeof(*src)) {
+ MGET(m, M_DONTWAIT, MT_SONAME);
+ if (m == 0)
+ goto bad;
+ m->m_len = src->siso_len;
+ src = mtod(m, struct sockaddr_iso *);
+ bcopy((caddr_t) srcsa, (caddr_t) src, srcsa->sa_len);
+ }
+ bcopy((caddr_t) up + 2, TSEL(src), up[1]);
+ up += 2 + src->siso_tlen;
+ continue;
+
+ case CLTPOVAL_DST:
+ dtsap = 2 + (caddr_t) up;
+ dlen = up[1];
+ up += 2 + dlen;
+ continue;
+
+ case CLTPOVAL_CSM:
+ if (iso_check_csum(m0, len)) {
+ cltpstat.cltps_badsum++;
goto bad;
- m->m_len = src->siso_len;
- src = mtod(m, struct sockaddr_iso *);
- bcopy((caddr_t)srcsa, (caddr_t)src, srcsa->sa_len);
- }
- bcopy((caddr_t)up + 2, TSEL(src), up[1]);
- up += 2 + src->siso_tlen;
- continue;
-
- case CLTPOVAL_DST:
- dtsap = 2 + (caddr_t)up;
- dlen = up[1];
- up += 2 + dlen;
- continue;
-
- case CLTPOVAL_CSM:
- if (iso_check_csum(m0, len)) {
- cltpstat.cltps_badsum++;
+ }
+ up += 4;
+ continue;
+
+ default:
+ printf("clts: unknown option (%x)\n", up[0]);
+ cltpstat.cltps_hdrops++;
goto bad;
}
- up += 4;
- continue;
-
- default:
- printf("clts: unknown option (%x)\n", up[0]);
- cltpstat.cltps_hdrops++;
- goto bad;
- }
if (dlen == 0 || src->siso_tlen == 0)
goto bad;
for (isop = cltb.isop_next;; isop = isop->isop_next) {
m->m_len -= hdrlen;
m->m_data += hdrlen;
if (sbappendaddr(&isop->isop_socket->so_rcv, sisotosa(src), m,
- (struct mbuf *)0) == 0)
+ (struct mbuf *) 0) == 0)
goto bad;
cltpstat.cltps_ipackets++;
sorwakeup(isop->isop_socket);
* Notify a cltp user of an asynchronous error;
* just wake up so that he can collect error status.
*/
+void
cltp_notify(isop)
register struct isopcb *isop;
{
}
void
-cltp_ctlinput(cmd, sa)
- int cmd;
+cltp_ctlinput(cmd, sa, dummy)
+ int cmd;
struct sockaddr *sa;
+ void *dummy;
{
- extern u_char inetctlerrmap[];
+ extern u_char inetctlerrmap[];
struct sockaddr_iso *siso;
- int iso_rtchange();
- if ((unsigned)cmd > PRC_NCMDS)
+ if ((unsigned) cmd > PRC_NCMDS)
return;
if (sa->sa_family != AF_ISO && sa->sa_family != AF_CCITT)
return;
case PRC_REDIRECT_TOSNET:
case PRC_REDIRECT_TOSHOST:
iso_pcbnotify(&cltb, siso,
- (int)inetctlerrmap[cmd], iso_rtchange);
+ (int) inetctlerrmap[cmd], iso_rtchange);
break;
default:
if (inetctlerrmap[cmd] == 0)
- return; /* XXX */
- iso_pcbnotify(&cltb, siso, (int)inetctlerrmap[cmd],
- cltp_notify);
+ return; /* XXX */
+ iso_pcbnotify(&cltb, siso, (int) inetctlerrmap[cmd],
+ cltp_notify);
}
}
-cltp_output(isop, m)
- register struct isopcb *isop;
- register struct mbuf *m;
+int
+#if __STDC__
+cltp_output(struct mbuf *m, ...)
+#else
+cltp_output(m, va_alist)
+ struct mbuf *m;
+ va_dcl
+#endif
{
- register int len;
+ register struct isopcb *isop;
+ register int len;
register struct sockaddr_iso *siso;
- int hdrlen, error = 0, docsum;
+ int hdrlen, error = 0, docsum;
register u_char *up;
+ va_list ap;
+
+ va_start(ap, m);
+ isop = va_arg(ap, struct isopcb *);
+ va_end(ap);
if (isop->isop_laddr == 0 || isop->isop_faddr == 0) {
error = ENOTCONN;
* Calculate data length and get a mbuf for CLTP header.
*/
hdrlen = 2 + 2 + isop->isop_laddr->siso_tlen
- + 2 + isop->isop_faddr->siso_tlen;
- if (docsum = /*isop->isop_flags & CLNP_NO_CKSUM*/ cltp_cksum)
+ + 2 + isop->isop_faddr->siso_tlen;
+ docsum = /* isop->isop_flags & CLNP_NO_CKSUM */ cltp_cksum;
+ if (docsum)
hdrlen += 4;
M_PREPEND(m, hdrlen, M_WAIT);
len = m->m_pkthdr.len;
up[2] = CLTPOVAL_SRC;
up[3] = (siso = isop->isop_laddr)->siso_tlen;
up += 4;
- bcopy(TSEL(siso), (caddr_t)up, siso->siso_tlen);
+ bcopy(TSEL(siso), (caddr_t) up, siso->siso_tlen);
up += siso->siso_tlen;
up[0] = CLTPOVAL_DST;
up[1] = (siso = isop->isop_faddr)->siso_tlen;
up += 2;
- bcopy(TSEL(siso), (caddr_t)up, siso->siso_tlen);
+ bcopy(TSEL(siso), (caddr_t) up, siso->siso_tlen);
/*
* Stuff checksum and output datagram.
*/
iso_gen_csum(m, 2 + up - mtod(m, u_char *), len);
}
cltpstat.cltps_opackets++;
- return (tpclnp_output(isop, m, len, !docsum));
+ return (tpclnp_output(m, len, isop, !docsum));
bad:
m_freem(m);
return (error);
}
-u_long cltp_sendspace = 9216; /* really max datagram size */
-u_long cltp_recvspace = 40 * (1024 + sizeof(struct sockaddr_iso));
- /* 40 1K datagrams */
+u_long cltp_sendspace = 9216; /* really max datagram size */
+u_long cltp_recvspace = 40 * (1024 + sizeof(struct sockaddr_iso));
+/* 40 1K datagrams */
-/*ARGSUSED*/
+/* ARGSUSED */
+int
cltp_usrreq(so, req, m, nam, control)
- struct socket *so;
- int req;
- struct mbuf *m, *nam, *control;
+ struct socket *so;
+ int req;
+ struct mbuf *m, *nam, *control;
{
register struct isopcb *isop = sotoisopcb(so);
- int s, error = 0;
+ int s = 0, error = 0;
if (req == PRU_CONTROL)
- return (iso_control(so, (long)m, (caddr_t)nam,
- (struct ifnet *)control));
+ return (iso_control(so, (long) m, (caddr_t) nam,
+ (struct ifnet *) control));
if ((isop == NULL && req != PRU_ATTACH) ||
(control && control->m_len)) {
error = EINVAL;
break;
}
iso_pcbdisconnect(isop);
- so->so_state &= ~SS_ISCONNECTED; /* XXX */
+ so->so_state &= ~SS_ISCONNECTED; /* XXX */
break;
case PRU_SHUTDOWN:
break;
}
}
- error = cltp_output(isop, m);
+ error = cltp_output(m, isop);
m = 0;
if (nam) {
iso_pcbdisconnect(isop);
case PRU_SOCKADDR:
if (isop->isop_laddr)
- bcopy((caddr_t)isop->isop_laddr, mtod(m, caddr_t),
- nam->m_len = isop->isop_laddr->siso_len);
+ bcopy((caddr_t) isop->isop_laddr, mtod(m, caddr_t),
+ nam->m_len = isop->isop_laddr->siso_len);
break;
case PRU_PEERADDR:
if (isop->isop_faddr)
- bcopy((caddr_t)isop->isop_faddr, mtod(m, caddr_t),
- nam->m_len = isop->isop_faddr->siso_len);
+ bcopy((caddr_t) isop->isop_faddr, mtod(m, caddr_t),
+ nam->m_len = isop->isop_faddr->siso_len);
break;
case PRU_SENSE:
case PRU_SLOWTIMO:
case PRU_PROTORCV:
case PRU_PROTOSEND:
- error = EOPNOTSUPP;
+ error = EOPNOTSUPP;
break;
case PRU_RCVD:
-/* $NetBSD: cltp_var.h,v 1.6 1995/03/26 20:35:15 jtc Exp $ */
+/* $OpenBSD: cltp_var.h,v 1.2 1996/03/04 10:35:08 mickey Exp $ */
+/* $NetBSD: cltp_var.h,v 1.7 1996/02/13 22:09:03 christos Exp $ */
/*
* Copyright (c) 1989, 1993
#define CLTPOVAL_DST 0xc2 /* Destination TSAP -- required */
#define CLTPOVAL_CSM 0xc3 /* Checksum parameter -- optional */
-struct cltpstat {
- int cltps_hdrops;
- int cltps_badsum;
- int cltps_badlen;
- int cltps_noport;
- int cltps_ipackets;
- int cltps_opackets;
+struct cltpstat {
+ int cltps_hdrops;
+ int cltps_badsum;
+ int cltps_badlen;
+ int cltps_noport;
+ int cltps_ipackets;
+ int cltps_opackets;
};
#ifdef _KERNEL
-struct isopcb cltb;
-struct cltpstat cltpstat;
+struct isopcb cltb;
+struct cltpstat cltpstat;
+
+/* cltp_usrreq.c */
+void cltp_init __P((void));
+void cltp_input __P((struct mbuf *, ...));
+void cltp_notify __P((struct isopcb *));
+void cltp_ctlinput __P((int, struct sockaddr *, void *));
+int cltp_output __P((struct mbuf *, ...));
+int cltp_usrreq __P((struct socket *, int, struct mbuf *, struct mbuf *,
+ struct mbuf *));
#endif
-/* $NetBSD: cons.h,v 1.7 1995/03/29 22:09:44 briggs Exp $ */
+/* $OpenBSD: cons.h,v 1.2 1996/03/04 10:35:10 mickey Exp $ */
+/* $NetBSD: cons.h,v 1.8 1996/02/13 22:09:10 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
* interface between TP and CONS
*/
-#define CONSOPT_X25CRUD 0x01 /* set x.25 call request user data */
+#define CONSOPT_X25CRUD 0x01 /* set x.25 call request user data */
struct dte_addr {
- u_char dtea_addr[7];
- u_char dtea_niblen;
+ u_char dtea_addr[7];
+ u_char dtea_niblen;
};
#ifdef _KERNEL
#ifndef PRC_NCMDS
#include <sys/protosw.h>
-#endif /* PRC_NCMDS */
+#endif /* PRC_NCMDS */
-#define PRC_CONS_SEND_DONE 2 /* something unused in protosw.h */
+#define PRC_CONS_SEND_DONE 2 /* something unused in protosw.h */
-#endif /* _KERNEL */
+#endif /* _KERNEL */
-/* $NetBSD: cons_pcb.h,v 1.6 1995/03/26 20:35:18 jtc Exp $ */
+/* $OpenBSD: cons_pcb.h,v 1.2 1996/03/04 10:35:11 mickey Exp $ */
+/* $NetBSD: cons_pcb.h,v 1.7 1996/02/13 22:09:14 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
#define X25_PARTIAL_PKT_LEN_MAX (MLEN - sizeof(struct cons_pcb))
#ifndef ARGO_DEBUG
-#define X25_TTL 600 /* 5 min */
-#else /* ARGO_DEBUG */
-#define X25_TTL 120 /* 1 min */
-#endif /* ARGO_DEBUG */
+#define X25_TTL 600 /* 5 min */
+#else /* ARGO_DEBUG */
+#define X25_TTL 120 /* 1 min */
+#endif /* ARGO_DEBUG */
struct cons_pcb {
- struct isopcb _co_isopcb;
+ struct isopcb _co_isopcb;
#define co_next _co_isopcb.isop_next
-/* prev used for netstat only */
+ /* prev used for netstat only */
#define co_prev _co_isopcb.isop_prev
#define co_head _co_isopcb.isop_head
#define co_laddr _co_isopcb.isop_laddr
#define co_negchanmask _co_isopcb.isop_negchanmask
#define co_x25crud _co_isopcb.isop_x25crud
#define co_x25crud_len _co_isopcb.isop_x25crud_len
- u_short co_state;
- u_char co_flags;
- u_short co_ttl; /* time to live timer */
- u_short co_init_ttl; /* initial value of ttl */
- int co_channel; /* logical channel */
- struct ifnet * co_ifp; /* interface */
- struct protosw *co_proto;
-
- struct ifqueue co_pending; /* queue data to send when connection
- completes*/
-#define MAX_DTE_LEN 0x7 /* 17 bcd digits */
- struct dte_addr co_peer_dte;
- struct cons_pcb *co_myself; /* DEBUGGING AID */
+ u_short co_state;
+ u_char co_flags;
+ u_short co_ttl; /* time to live timer */
+ u_short co_init_ttl; /* initial value of ttl */
+ int co_channel; /* logical channel */
+ struct ifnet *co_ifp; /* interface */
+ struct protosw *co_proto;
+
+ struct ifqueue co_pending; /* queue data to send when connection
+ * completes */
+#define MAX_DTE_LEN 0x7 /* 17 bcd digits */
+ struct dte_addr co_peer_dte;
+ struct cons_pcb *co_myself; /* DEBUGGING AID */
};
/*
- * X.25 Packet types
+ * X.25 Packet types
*/
#define XPKT_DATA 1
#define XPKT_INTERRUPT 2
-#define XPKT_FLOWCONTROL 3 /* not delivered? */
+#define XPKT_FLOWCONTROL 3 /* not delivered? */
/*
* pcb xtates
/* type */
-#define CONSF_OCRE 0x40 /* created on OUTPUT */
-#define CONSF_ICRE 0x20 /* created on INPUT */
-#define CONSF_unused 0x10 /* not used */
-#define CONSF_unused2 0x08 /* not used */
-#define CONSF_DGM 0x04 /* for dgm use only */
-#define CONSF_XTS 0x02 /* for cons-as-transport-service */
-#define CONSF_LOOPBACK 0x01 /* loopback was on when connection commenced */
+#define CONSF_OCRE 0x40 /* created on OUTPUT */
+#define CONSF_ICRE 0x20 /* created on INPUT */
+#define CONSF_unused 0x10 /* not used */
+#define CONSF_unused2 0x08 /* not used */
+#define CONSF_DGM 0x04 /* for dgm use only */
+#define CONSF_XTS 0x02 /* for cons-as-transport-service */
+#define CONSF_LOOPBACK 0x01 /* loopback was on when connection commenced */
#define X_NOCHANNEL 0x80
struct cons_stat {
- u_int co_intr; /* input from eicon board */
- u_int co_restart; /* ecn_restart() request issued to board */
- u_int co_slowtimo; /* times slowtimo called */
- u_int co_timedout; /* connections closed by slowtimo */
- u_int co_ack; /* ECN_ACK indication came from eicon board */
- u_int co_receive; /* ECN_RECEIVE indication came from eicon board */
- u_int co_send; /* ECN_SEND request issued to board */
- u_int co_reset_in; /* ECN_RESET indication came from eicon board */
- u_int co_reset_out; /* ECN_RESET issued to the eicon board */
- u_int co_clear_in; /* ECN_CLEAR indication came from eicon board */
- u_int co_clear_out; /* ECN_CLEAR request issued to board */
- u_int co_refuse; /* ECN_REFUSE indication came from eicon board */
- u_int co_accept; /* ECN_ACCEPT indication came from eicon board */
- u_int co_connect; /* ECN_CONNECT indication came from eicon board */
- u_int co_call; /* ECN_CALL request issued to board */
- u_int co_Rdrops; /* bad pkt came from ll */
- u_int co_Xdrops; /* can't keep up */
-
- u_int co_intrpt_pkts_in; /* interrupt packets in */
- u_int co_avg_qlen;
- u_int co_avg_qdrop;
- u_int co_active;
-
- u_int co_noresources;
- u_int co_parse_facil_err;
- u_int co_addr_proto_consist_err;
- u_int co_no_copcb;
-} cons_stat;
-
-u_char x25_error_stats[CONL_ERROR_MAX + 1];
-
-struct ifqueue consintrq;
+ u_int co_intr;/* input from eicon board */
+ u_int co_restart; /* ecn_restart() request issued to
+ * board */
+ u_int co_slowtimo; /* times slowtimo called */
+ u_int co_timedout; /* connections closed by slowtimo */
+ u_int co_ack; /* ECN_ACK indication came from eicon board */
+ u_int co_receive; /* ECN_RECEIVE indication came from
+ * eicon board */
+ u_int co_send;/* ECN_SEND request issued to board */
+ u_int co_reset_in; /* ECN_RESET indication came from
+ * eicon board */
+ u_int co_reset_out; /* ECN_RESET issued to the eicon
+ * board */
+ u_int co_clear_in; /* ECN_CLEAR indication came from
+ * eicon board */
+ u_int co_clear_out; /* ECN_CLEAR request issued to board */
+ u_int co_refuse; /* ECN_REFUSE indication came from
+ * eicon board */
+ u_int co_accept; /* ECN_ACCEPT indication came from
+ * eicon board */
+ u_int co_connect; /* ECN_CONNECT indication came from
+ * eicon board */
+ u_int co_call;/* ECN_CALL request issued to board */
+ u_int co_Rdrops; /* bad pkt came from ll */
+ u_int co_Xdrops; /* can't keep up */
+
+ u_int co_intrpt_pkts_in; /* interrupt packets in */
+ u_int co_avg_qlen;
+ u_int co_avg_qdrop;
+ u_int co_active;
+
+ u_int co_noresources;
+ u_int co_parse_facil_err;
+ u_int co_addr_proto_consist_err;
+ u_int co_no_copcb;
+} cons_stat;
+
+u_char x25_error_stats[CONL_ERROR_MAX + 1];
+
+struct ifqueue consintrq;
/* reasons for clear are in a data mbuf chained to a clear ecn_request */
-struct e_clear_data {
- u_char ecd_cause;
- u_char ecd_diagnostic;
+struct e_clear_data {
+ u_char ecd_cause;
+ u_char ecd_diagnostic;
};
#ifdef _KERNEL
#define IncStat(XYZ) cons_stat.XYZ++
-#endif /* _KERNEL */
+#endif /* _KERNEL */
-/* $NetBSD: eonvar.h,v 1.5 1994/06/29 06:39:30 cgd Exp $ */
+/* $OpenBSD: eonvar.h,v 1.2 1996/03/04 10:35:13 mickey Exp $ */
+/* $NetBSD: eonvar.h,v 1.6 1996/02/13 22:09:18 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
#define E_LINK 2
#define E_ES 3
#define E_IS 4
-
-/*
+
+/*
* this overlays a sockaddr_iso
*/
struct sockaddr_eon {
- u_char seon_len; /* Length */
- u_char seon_family; /* AF_ISO */
- u_char seon_status; /* overlays session suffixlen */
+ u_char seon_len; /* Length */
+ u_char seon_family; /* AF_ISO */
+ u_char seon_status; /* overlays session suffixlen */
#define EON_ESLINK_UP 0x1
#define EON_ESLINK_DOWN 0x2
#define EON_ISLINK_UP 0x10
#define EON_ISLINK_DOWN 0x20
-/* no change is neither up or down */
- u_char seon_pad1; /* 0, overlays tsfxlen */
- u_char seon_adrlen;
- u_char seon_afi; /* 47 */
- u_char seon_idi[2]; /* 0006 */
- u_char seon_vers; /* 03 */
- u_char seon_glbnum[2]; /* see RFC 1069 */
- u_char seon_RDN[2]; /* see RFC 1070 */
- u_char seon_pad2[3]; /* see RFC 1070 */
- u_char seon_LAREA[2]; /* see RFC 1070 */
- u_char seon_pad3[2]; /* see RFC 1070 */
- /* right now ip addr is aligned -- be careful --
- * future revisions may have it u_char[4]
- */
- u_int seon_ipaddr; /* a.b.c.d */
- u_char seon_protoid; /* NSEL */
+ /* no change is neither up or down */
+ u_char seon_pad1; /* 0, overlays tsfxlen */
+ u_char seon_adrlen;
+ u_char seon_afi; /* 47 */
+ u_char seon_idi[2]; /* 0006 */
+ u_char seon_vers; /* 03 */
+ u_char seon_glbnum[2]; /* see RFC 1069 */
+ u_char seon_RDN[2]; /* see RFC 1070 */
+ u_char seon_pad2[3]; /* see RFC 1070 */
+ u_char seon_LAREA[2]; /* see RFC 1070 */
+ u_char seon_pad3[2]; /* see RFC 1070 */
+ /*
+ * right now ip addr is aligned -- be careful -- future revisions
+ * may have it u_char[4]
+ */
+ u_int seon_ipaddr; /* a.b.c.d */
+ u_char seon_protoid; /* NSEL */
};
#ifdef EON_TEMPLATE
struct sockaddr_eon eon_template = {
- sizeof (eon_template), AF_ISO, 0, 0, 0x14,
+ sizeof(eon_template), AF_ISO, 0, 0, 0x14,
0x47, 0x0, 0x6, 0x3, 0
};
#endif
#define DOWNBITS ( EON_ESLINK_DOWN | EON_ISLINK_DOWN )
#define UPBITS ( EON_ESLINK_UP | EON_ISLINK_UP )
-#define SIOCSEONCORE _IOWR('i',10, struct iso_ifreq) /* EON core member */
-#define SIOCGEONCORE _IOWR('i',11, struct iso_ifreq) /* EON core member */
+#define SIOCSEONCORE _IOWR('i',10, struct iso_ifreq) /* EON core member */
+#define SIOCGEONCORE _IOWR('i',11, struct iso_ifreq) /* EON core member */
struct eon_hdr {
- u_char eonh_vers; /* value 1 */
- u_char eonh_class; /* address multicast class, below */
+ u_char eonh_vers; /* value 1 */
+ u_char eonh_class; /* address multicast class, below */
#define EON_NORMAL_ADDR 0x0
#define EON_MULTICAST_ES 0x1
#define EON_MULTICAST_IS 0x2
#define EON_BROADCAST 0x3
- u_short eonh_csum; /* osi checksum (choke)*/
+ u_short eonh_csum; /* osi checksum (choke) */
};
struct eon_iphdr {
- struct ip ei_ip;
- struct eon_hdr ei_eh;
+ struct ip ei_ip;
+ struct eon_hdr ei_eh;
};
#define EONIPLEN (sizeof(struct eon_hdr) + sizeof(struct ip))
#define IFF_IS 0x800
struct eon_stat {
- int es_in_multi_es;
- int es_in_multi_is;
- int es_in_broad;
- int es_in_normal;
- int es_out_multi_es;
- int es_out_multi_is;
- int es_out_broad;
- int es_out_normal;
- int es_ipout;
-
- int es_icmp[PRC_NCMDS];
+ int es_in_multi_es;
+ int es_in_multi_is;
+ int es_in_broad;
+ int es_in_normal;
+ int es_out_multi_es;
+ int es_out_multi_is;
+ int es_out_broad;
+ int es_out_normal;
+ int es_ipout;
+
+ int es_icmp[PRC_NCMDS];
/* errors */
- int es_badcsum;
- int es_badhdr;
-} eonstat;
+ int es_badcsum;
+ int es_badhdr;
+} eonstat;
#undef IncStat
#define IncStat(xxx) eonstat.xxx++
typedef struct qhdr {
- struct qhdr *link, *rlink;
-} *queue_t;
+ struct qhdr *link, *rlink;
+} *queue_t;
struct eon_llinfo {
- struct qhdr el_qhdr; /* keep all in a list */
- int el_flags; /* cache valid ? */
- int el_snpaoffset; /* IP address contained in dst nsap */
- struct rtentry *el_rt; /* back pointer to parent route */
- struct eon_iphdr el_ei; /* precomputed portion of hdr */
- struct route el_iproute; /* if direct route cache IP info */
- /* if gateway, cache secondary route */
+ struct qhdr el_qhdr;/* keep all in a list */
+ int el_flags; /* cache valid ? */
+ int el_snpaoffset; /* IP address contained in dst nsap */
+ struct rtentry *el_rt; /* back pointer to parent route */
+ struct eon_iphdr el_ei; /* precomputed portion of hdr */
+ struct route el_iproute; /* if direct route cache IP info */
+ /* if gateway, cache secondary route */
};
#define el_iphdr el_ei.ei_ip
#define el_eonhdr el_ei.ei_eh
+
+#ifdef _KERNEL
+void eonprotoinit __P((void));
+void eonattach __P((void));
+int eonioctl __P((struct ifnet *, u_long, caddr_t));
+void eoniphdr __P((struct eon_iphdr *, caddr_t, struct route *, int, int));
+void eonrtrequest __P((int, struct rtentry *, struct sockaddr *));
+int eonoutput __P((struct ifnet *, struct mbuf *, struct sockaddr *,
+ struct rtentry *));
+void eoninput __P((struct mbuf *, ...));
+void *eonctlinput __P((int, struct sockaddr *, void *));
+#endif
-/* $NetBSD: esis.c,v 1.11 1995/08/17 02:57:31 mycroft Exp $ */
+/* $OpenBSD: esis.c,v 1.2 1996/03/04 10:35:15 mickey Exp $ */
+/* $NetBSD: esis.c,v 1.12 1996/02/13 22:09:23 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
#include <netiso/esis.h>
#include <netiso/argo_debug.h>
+#include <machine/stdarg.h>
/*
* Global variables to esis implementation
*
* esis_holding_time - the holding time (sec) parameter for outgoing pdus
* esis_config_time - the frequency (sec) that hellos are generated
- * esis_esconfig_time - suggested es configuration time placed in the
- * ish.
+ * esis_esconfig_time - suggested es configuration time placed in the ish.
*
*/
LIST_HEAD(, rawcb) esis_pcb;
-void esis_config(), snpac_age();
-int esis_sendspace = 2048;
-int esis_recvspace = 2048;
-short esis_holding_time = ESIS_HT;
-short esis_config_time = ESIS_CONFIG;
-short esis_esconfig_time = ESIS_CONFIG;
-extern int iso_systype;
-struct sockaddr_dl esis_dl = { sizeof(esis_dl), AF_LINK };
-extern char all_es_snpa[], all_is_snpa[];
+int esis_sendspace = 2048;
+int esis_recvspace = 2048;
+short esis_holding_time = ESIS_HT;
+short esis_config_time = ESIS_CONFIG;
+short esis_esconfig_time = ESIS_CONFIG;
+extern int iso_systype;
+struct sockaddr_dl esis_dl = {sizeof(esis_dl), AF_LINK};
+extern char all_es_snpa[], all_is_snpa[];
#define EXTEND_PACKET(m, mhdr, cp)\
if (((m)->m_next = m_getclr(M_DONTWAIT, MT_HEADER)) == NULL) {\
(cp) = mtod((m), caddr_t);\
}
-void esis_input(), isis_input();
-#ifdef ISO_X25ESIS
-void x25esis_input();
-#endif /* ISO_X25ESIS */
-
/*
* FUNCTION: esis_init
*
- * PURPOSE: Initialize the kernel portion of esis protocol
+ * PURPOSE: Initialize the kernel portion of esis protocol
*
- * RETURNS: nothing
+ * RETURNS: nothing
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
*/
void
esis_init()
LIST_INIT(&esis_pcb);
- timeout(snpac_age, (caddr_t)0, hz);
- timeout(esis_config, (caddr_t)0, hz);
+ timeout(snpac_age, (caddr_t) 0, hz);
+ timeout(esis_config, (caddr_t) 0, hz);
clnl_protox[ISO9542_ESIS].clnl_input = esis_input;
clnl_protox[ISO10589_ISIS].clnl_input = isis_input;
#ifdef ISO_X25ESIS
clnl_protox[ISO9542X25_ESIS].clnl_input = x25esis_input;
-#endif /* ISO_X25ESIS */
+#endif /* ISO_X25ESIS */
}
/*
* FUNCTION: esis_usrreq
*
- * PURPOSE: Handle user level esis requests
+ * PURPOSE: Handle user level esis requests
*
- * RETURNS: 0 or appropriate errno
+ * RETURNS: 0 or appropriate errno
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
*/
-/*ARGSUSED*/
+/* ARGSUSED */
+int
esis_usrreq(so, req, m, nam, control)
-struct socket *so; /* socket: used only to get to this code */
-int req; /* request */
-struct mbuf *m; /* data for request */
-struct mbuf *nam; /* optional name */
-struct mbuf *control; /* optional control */
+ struct socket *so; /* socket: used only to get to this code */
+ int req; /* request */
+ struct mbuf *m; /* data for request */
+ struct mbuf *nam; /* optional name */
+ struct mbuf *control;/* optional control */
{
- struct rawcb *rp = sotorawcb(so);
- int error = 0;
+ struct rawcb *rp = sotorawcb(so);
+ int error = 0;
if ((so->so_state & SS_PRIV) == 0) {
error = EACCES;
error = EINVAL;
goto release;
}
-
switch (req) {
case PRU_ATTACH:
if (rp != NULL) {
break;
}
MALLOC(rp, struct rawcb *, sizeof(*rp), M_PCB, M_WAITOK);
- if (so->so_pcb = rp) {
- bzero((caddr_t)so->so_pcb, sizeof(*rp));
+ if ((so->so_pcb = rp) != NULL) {
+ bzero(so->so_pcb, sizeof(*rp));
LIST_INSERT_HEAD(&esis_pcb, rp, rcb_list);
rp->rcb_socket = so;
error = soreserve(so, esis_sendspace, esis_recvspace);
break;
}
/* error checking here */
- error = isis_output(mtod(nam,struct sockaddr_dl *), m);
+ error = isis_output(m, mtod(nam, struct sockaddr_dl *));
m = NULL;
break;
/*
* FUNCTION: esis_input
*
- * PURPOSE: Process an incoming esis packet
+ * PURPOSE: Process an incoming esis packet
*
- * RETURNS: nothing
+ * RETURNS: nothing
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
*/
void
-esis_input(m0, shp)
-struct mbuf *m0; /* ptr to first mbuf of pkt */
-struct snpa_hdr *shp; /* subnetwork header */
+#if __STDC__
+esis_input(struct mbuf *m0, ...)
+#else
+esis_input(m0, va_alist)
+ struct mbuf *m0;
+ va_dcl
+#endif
{
- register struct esis_fixed *pdu = mtod(m0, struct esis_fixed *);
- register int type;
+ struct snpa_hdr *shp; /* subnetwork header */
+ register struct esis_fixed *pdu = mtod(m0, struct esis_fixed *);
+ register int type;
+ va_list ap;
+
+ va_start(ap, m0);
+ shp = va_arg(ap, struct snpa_hdr *);
+ va_end(ap);
/*
* check checksum if necessary
*/
- if (ESIS_CKSUM_REQUIRED(pdu) && iso_check_csum(m0, (int)pdu->esis_hdr_len)) {
+ if (ESIS_CKSUM_REQUIRED(pdu) &&
+ iso_check_csum(m0, (int) pdu->esis_hdr_len)) {
esis_stat.es_badcsum++;
goto bad;
}
-
/* check version */
if (pdu->esis_vers != ESIS_VERSION) {
esis_stat.es_badvers++;
}
type = pdu->esis_type & 0x1f;
switch (type) {
- case ESIS_ESH:
- esis_eshinput(m0, shp);
- break;
+ case ESIS_ESH:
+ esis_eshinput(m0, shp);
+ break;
- case ESIS_ISH:
- esis_ishinput(m0, shp);
- break;
+ case ESIS_ISH:
+ esis_ishinput(m0, shp);
+ break;
- case ESIS_RD:
- esis_rdinput(m0, shp);
- break;
+ case ESIS_RD:
+ esis_rdinput(m0, shp);
+ break;
- default:
- esis_stat.es_badtype++;
+ default:
+ esis_stat.es_badtype++;
}
bad:
/*
* FUNCTION: esis_rdoutput
*
- * PURPOSE: Transmit a redirect pdu
+ * PURPOSE: Transmit a redirect pdu
*
- * RETURNS: nothing
+ * RETURNS: nothing
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES: Assumes there is enough space for fixed part of header,
- * DA, BSNPA and NET in first mbuf.
+ * NOTES: Assumes there is enough space for fixed part of header,
+ * DA, BSNPA and NET in first mbuf.
*/
+void
esis_rdoutput(inbound_shp, inbound_m, inbound_oidx, rd_dstnsap, rt)
-struct snpa_hdr *inbound_shp; /* snpa hdr from incoming packet */
-struct mbuf *inbound_m; /* incoming pkt itself */
-struct clnp_optidx *inbound_oidx; /* clnp options assoc with incoming pkt */
-struct iso_addr *rd_dstnsap; /* ultimate destination of pkt */
-struct rtentry *rt; /* snpa cache info regarding next hop of
- pkt */
+ struct snpa_hdr *inbound_shp; /* snpa hdr from incoming packet */
+ struct mbuf *inbound_m; /* incoming pkt itself */
+ struct clnp_optidx *inbound_oidx; /* clnp options assoc with
+ * incoming pkt */
+ struct iso_addr *rd_dstnsap; /* ultimate destination of pkt */
+ struct rtentry *rt; /* snpa cache info regarding next hop of pkt */
{
- struct mbuf *m, *m0;
- caddr_t cp;
- struct esis_fixed *pdu;
- int len, total_len = 0;
- struct sockaddr_iso siso;
- struct ifnet *ifp = inbound_shp->snh_ifp;
+ struct mbuf *m, *m0;
+ caddr_t cp;
+ struct esis_fixed *pdu;
+ int len;
+ struct sockaddr_iso siso;
+ struct ifnet *ifp = inbound_shp->snh_ifp;
struct sockaddr_dl *sdl;
struct iso_addr *rd_gwnsap;
rt = rtalloc1(rt->rt_gateway, 0);
} else
rd_gwnsap = &satosiso(rt_key(rt))->siso_addr;
- if (rt == 0 || (sdl = (struct sockaddr_dl *)rt->rt_gateway) == 0 ||
- sdl->sdl_family != AF_LINK) {
- /* maybe we should have a function that you
- could put in the iso_ifaddr structure
- which could translate iso_addrs into snpa's
- where there is a known mapping for that address type */
+ if (rt == 0 || (sdl = (struct sockaddr_dl *) rt->rt_gateway) == 0 ||
+ sdl->sdl_family != AF_LINK) {
+ /*
+ * maybe we should have a function that you could put in the
+ * iso_ifaddr structure which could translate iso_addrs into
+ * snpa's where there is a known mapping for that address
+ * type
+ */
esis_stat.es_badtype++;
return;
}
esis_stat.es_rdsent++;
- IFDEBUG(D_ESISOUTPUT)
- printf("esis_rdoutput: ifp x%x (%s%d), ht %d, m x%x, oidx x%x\n",
- ifp, ifp->if_name, ifp->if_unit, esis_holding_time, inbound_m,
- inbound_oidx);
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ESISOUTPUT]) {
+ printf(
+ "esis_rdoutput: ifp x%x (%s%d), ht %d, m x%x, oidx x%x\n",
+ (unsigned int) ifp, ifp->if_name, ifp->if_unit,
+ esis_holding_time,
+ (unsigned int) inbound_m, (unsigned int) inbound_oidx);
printf("\tdestination: %s\n", clnp_iso_addrp(rd_dstnsap));
printf("\tredirected toward:%s\n", clnp_iso_addrp(rd_gwnsap));
- ENDDEBUG
+ }
+#endif
if ((m0 = m = m_gethdr(M_DONTWAIT, MT_HEADER)) == NULL) {
esis_stat.es_nomem++;
bzero(mtod(m, caddr_t), MHLEN);
pdu = mtod(m, struct esis_fixed *);
- cp = (caddr_t)(pdu + 1); /*pointer arith.; 1st byte after header */
+ cp = (caddr_t) (pdu + 1); /* pointer arith.; 1st byte after
+ * header */
len = sizeof(struct esis_fixed);
/*
cp += sdl->sdl_alen;
len += (sdl->sdl_alen + 1);
- /*
- * If the next hop is not the destination, then it ought to be
- * an IS and it should be inserted next. Else, set the
- * NETL to 0
+ /*
+ * If the next hop is not the destination, then it ought to be an IS
+ * and it should be inserted next. Else, set the NETL to 0
*/
/* PHASE2 use mask from ifp of outgoing interface */
if (!iso_addrmatch1(rd_dstnsap, rd_gwnsap)) {
- /* this should not happen:
+#if 0
+ /* this should not happen: */
if ((nhop_sc->sc_flags & SNPA_IS) == 0) {
- printf("esis_rdoutput: next hop is not dst and not an IS\n");
+ printf(
+ "esis_rdoutput: next hop is not dst and not an IS\n");
m_freem(m0);
return;
- } */
+ }
+#endif
(void) esis_insert_addr(&cp, &len, rd_gwnsap, m, 0);
} else {
*cp++ = 0; /* NETL */
m->m_len = len;
/*
- * PHASE2
- * If redirect is to an IS, add an address mask. The mask to be
- * used should be the mask present in the routing entry used to
- * forward the original data packet.
+ * PHASE2
+ * If redirect is to an IS, add an address mask. The mask to be
+ * used should be the mask present in the routing entry used to
+ * forward the original data packet.
*/
-
+
/*
- * Copy Qos, priority, or security options present in original npdu
+ * Copy Qos, priority, or security options present in original npdu
*/
if (inbound_oidx) {
/* THIS CODE IS CURRENTLY (mostly) UNTESTED */
- int optlen = 0;
+ int optlen = 0;
if (inbound_oidx->cni_qos_formatp)
optlen += (inbound_oidx->cni_qos_len + 2);
- if (inbound_oidx->cni_priorp) /* priority option is 1 byte long */
+ if (inbound_oidx->cni_priorp) /* priority option is 1 byte
+ * long */
optlen += 3;
if (inbound_oidx->cni_securep)
optlen += (inbound_oidx->cni_secure_len + 2);
/* assumes MLEN > optlen */
}
/* assume MLEN-len > optlen */
- /*
- * When copying options, copy from ptr - 2 in order to grab
- * the option code and length
+ /*
+ * When copying options, copy from ptr - 2 in order to grab
+ * the option code and length
*/
if (inbound_oidx->cni_qos_formatp) {
- bcopy(mtod(inbound_m, caddr_t) + inbound_oidx->cni_qos_formatp - 2,
- cp, (unsigned)(inbound_oidx->cni_qos_len + 2));
+ bcopy(mtod(inbound_m, caddr_t) +
+ inbound_oidx->cni_qos_formatp - 2,
+ cp, (unsigned) (inbound_oidx->cni_qos_len + 2));
cp += inbound_oidx->cni_qos_len + 2;
}
if (inbound_oidx->cni_priorp) {
- bcopy(mtod(inbound_m, caddr_t) + inbound_oidx->cni_priorp - 2,
- cp, 3);
+ bcopy(mtod(inbound_m, caddr_t) +
+ inbound_oidx->cni_priorp - 2, cp, 3);
cp += 3;
}
if (inbound_oidx->cni_securep) {
- bcopy(mtod(inbound_m, caddr_t) + inbound_oidx->cni_securep - 2, cp,
- (unsigned)(inbound_oidx->cni_secure_len + 2));
+ bcopy(mtod(inbound_m, caddr_t) +
+ inbound_oidx->cni_securep - 2, cp,
+ (unsigned) (inbound_oidx->cni_secure_len + 2));
cp += inbound_oidx->cni_secure_len + 2;
}
m->m_len += optlen;
len += optlen;
}
-
pdu->esis_hdr_len = m0->m_pkthdr.len = len;
- iso_gen_csum(m0, ESIS_CKSUM_OFF, (int)pdu->esis_hdr_len);
+ iso_gen_csum(m0, ESIS_CKSUM_OFF, (int) pdu->esis_hdr_len);
- bzero((caddr_t)&siso, sizeof(siso));
+ bzero((caddr_t) & siso, sizeof(siso));
siso.siso_family = AF_ISO;
siso.siso_data[0] = AFI_SNA;
siso.siso_nlen = 6 + 1; /* should be taken from snpa_hdr */
- /* +1 is for AFI */
+ /* +1 is for AFI */
bcopy(inbound_shp->snh_shost, siso.siso_data + 1, 6);
- (ifp->if_output)(ifp, m0, sisotosa(&siso), 0);
+ (ifp->if_output) (ifp, m0, sisotosa(&siso), 0);
}
/*
* FUNCTION: esis_insert_addr
*
- * PURPOSE: Insert an iso_addr into a buffer
+ * PURPOSE: Insert an iso_addr into a buffer
*
- * RETURNS: true if buffer was big enough, else false
+ * RETURNS: true if buffer was big enough, else false
*
* SIDE EFFECTS: Increment buf & len according to size of iso_addr
*
- * NOTES: Plus 1 here is for length byte
+ * NOTES: Plus 1 here is for length byte
*/
+int
esis_insert_addr(buf, len, isoa, m, nsellen)
-register caddr_t *buf; /* ptr to buffer to put address into */
-int *len; /* ptr to length of buffer so far */
-register struct iso_addr *isoa; /* ptr to address */
-register struct mbuf *m; /* determine if there remains space */
-int nsellen;
+ register caddr_t *buf; /* ptr to buffer to put address into */
+ int *len; /* ptr to length of buffer so far */
+ register struct iso_addr *isoa; /* ptr to address */
+ register struct mbuf *m;/* determine if there remains space */
+ int nsellen;
{
- register int newlen, result = 0;
+ register int newlen, result = 0;
isoa->isoa_len -= nsellen;
newlen = isoa->isoa_len + 1;
- if (newlen <= M_TRAILINGSPACE(m)) {
- bcopy((caddr_t)isoa, *buf, newlen);
+ if (newlen <= M_TRAILINGSPACE(m)) {
+ bcopy((caddr_t) isoa, *buf, newlen);
*len += newlen;
*buf += newlen;
m->m_len += newlen;
if (b > buflim) {esis_stat.es_toosmall++; goto bad;}}
#define ESIS_NEXT_OPTION(b) { b += (2 + b[1]); \
if (b > buflim) {esis_stat.es_toosmall++; goto bad;}}
-int ESHonly = 0;
-/*
-
+int ESHonly = 0;
+
/*
* FUNCTION: esis_eshinput
*
- * PURPOSE: Process an incoming ESH pdu
+ * PURPOSE: Process an incoming ESH pdu
*
- * RETURNS: nothing
+ * RETURNS: nothing
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
*/
+void
esis_eshinput(m, shp)
-struct mbuf *m; /* esh pdu */
-struct snpa_hdr *shp; /* subnetwork header */
+ struct mbuf *m; /* esh pdu */
+ struct snpa_hdr *shp; /* subnetwork header */
{
- struct esis_fixed *pdu = mtod(m, struct esis_fixed *);
- u_short ht; /* holding time */
- struct iso_addr *nsap;
- int naddr;
- u_char *buf = (u_char *)(pdu + 1);
- u_char *buflim = pdu->esis_hdr_len + (u_char *)pdu;
- int new_entry = 0;
+ struct esis_fixed *pdu = mtod(m, struct esis_fixed *);
+ u_short ht; /* holding time */
+ struct iso_addr *nsap = NULL;
+ int naddr;
+ u_char *buf = (u_char *) (pdu + 1);
+ u_char *buflim = pdu->esis_hdr_len + (u_char *) pdu;
+ int new_entry = 0;
esis_stat.es_eshrcvd++;
if (naddr == 1) {
ESIS_EXTRACT_ADDR(nsap, buf);
new_entry = snpac_add(shp->snh_ifp,
- nsap, shp->snh_shost, SNPA_ES, ht, 0);
+ nsap, shp->snh_shost, SNPA_ES, ht, 0);
} else {
- int nsellength = 0, nlen = 0;
- {
- /* See if we want to compress out multiple nsaps differing
- only by nsel */
- register struct ifaddr *ifa;
- for (ifa = shp->snh_ifp->if_addrlist.tqh_first; ifa != 0;
- ifa = ifa->ifa_list.tqe_next)
- if (ifa->ifa_addr->sa_family == AF_ISO) {
- nsellength = ((struct iso_ifaddr *)ifa)->ia_addr.siso_tlen;
- break;
+ int nsellength = 0, nlen = 0;
+ struct ifaddr *ifa;
+ /*
+ * See if we want to compress out multiple nsaps
+ * differing only by nsel
+ */
+ for (ifa = shp->snh_ifp->if_addrlist.tqh_first; ifa != 0;
+ ifa = ifa->ifa_list.tqe_next)
+ if (ifa->ifa_addr->sa_family == AF_ISO) {
+ nsellength =
+ ((struct iso_ifaddr *) ifa)->ia_addr.siso_tlen;
+ break;
}
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ESISINPUT]) {
+ printf(
+ "esis_eshinput: esh: ht %d, naddr %d nsellength %d\n",
+ ht, naddr, nsellength);
}
- IFDEBUG(D_ESISINPUT)
- printf("esis_eshinput: esh: ht %d, naddr %d nsellength %d\n",
- ht, naddr, nsellength);
- ENDDEBUG
+#endif
while (naddr-- > 0) {
- struct iso_addr *nsap2; u_char *buf2;
+ struct iso_addr *nsap2;
+ u_char *buf2;
ESIS_EXTRACT_ADDR(nsap, buf);
- /* see if there is at least one more nsap in ESH differing
- only by nsel */
- if (nsellength != 0) for (buf2 = buf; buf2 < buflim;) {
- ESIS_EXTRACT_ADDR(nsap2, buf2);
- IFDEBUG(D_ESISINPUT)
- printf("esis_eshinput: comparing %s ",
- clnp_iso_addrp(nsap));
- printf("and %s\n", clnp_iso_addrp(nsap2));
- ENDDEBUG
- if (Bcmp(nsap->isoa_genaddr, nsap2->isoa_genaddr,
- nsap->isoa_len - nsellength) == 0) {
- nlen = nsellength;
- break;
+ /*
+ * see if there is at least one more nsap in ESH
+ * differing only by nsel
+ */
+ if (nsellength != 0)
+ for (buf2 = buf; buf2 < buflim;) {
+ ESIS_EXTRACT_ADDR(nsap2, buf2);
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ESISINPUT]) {
+ printf(
+ "esis_eshinput: comparing %s ",
+ clnp_iso_addrp(nsap));
+ printf("and %s\n",
+ clnp_iso_addrp(nsap2));
+ }
+#endif
+ if (Bcmp(nsap->isoa_genaddr,
+ nsap2->isoa_genaddr,
+ nsap->isoa_len - nsellength)
+ == 0) {
+ nlen = nsellength;
+ break;
+ }
}
- }
new_entry |= snpac_add(shp->snh_ifp,
- nsap, shp->snh_shost, SNPA_ES, ht, nlen);
+ nsap, shp->snh_shost, SNPA_ES, ht, nlen);
nlen = 0;
}
}
- IFDEBUG(D_ESISINPUT)
- printf("esis_eshinput: nsap %s is %s\n",
- clnp_iso_addrp(nsap), new_entry ? "new" : "old");
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ESISINPUT]) {
+ printf("esis_eshinput: nsap %s is %s\n",
+ clnp_iso_addrp(nsap), new_entry ? "new" : "old");
+ }
+#endif
if (new_entry && (iso_systype & SNPA_IS))
esis_shoutput(shp->snh_ifp, ESIS_ISH, esis_holding_time,
- shp->snh_shost, 6, (struct iso_addr *)0);
+ shp->snh_shost, 6, (struct iso_addr *) 0);
bad:
return;
}
/*
* FUNCTION: esis_ishinput
*
- * PURPOSE: process an incoming ISH pdu
+ * PURPOSE: process an incoming ISH pdu
*
- * RETURNS:
+ * RETURNS:
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
*/
+void
esis_ishinput(m, shp)
-struct mbuf *m; /* esh pdu */
-struct snpa_hdr *shp; /* subnetwork header */
+ struct mbuf *m; /* esh pdu */
+ struct snpa_hdr *shp; /* subnetwork header */
{
- struct esis_fixed *pdu = mtod(m, struct esis_fixed *);
- u_short ht, newct; /* holding time */
- struct iso_addr *nsap; /* Network Entity Title */
- register u_char *buf = (u_char *) (pdu + 1);
- register u_char *buflim = pdu->esis_hdr_len + (u_char *)pdu;
- int new_entry;
+ struct esis_fixed *pdu = mtod(m, struct esis_fixed *);
+ u_short ht, newct; /* holding time */
+ struct iso_addr *nsap; /* Network Entity Title */
+ register u_char *buf = (u_char *) (pdu + 1);
+ register u_char *buflim = pdu->esis_hdr_len + (u_char *) pdu;
+ int new_entry;
esis_stat.es_ishrcvd++;
CTOH(pdu->esis_ht_msb, pdu->esis_ht_lsb, ht);
- IFDEBUG(D_ESISINPUT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ESISINPUT]) {
printf("esis_ishinput: ish: ht %d\n", ht);
- ENDDEBUG
+ }
+#endif
if (ESHonly)
goto bad;
if (buf[1] != 2)
goto bad;
CTOH(buf[2], buf[3], newct);
- if (esis_config_time != newct) {
- untimeout(esis_config,0);
+ if ((u_short) esis_config_time != newct) {
+ untimeout(esis_config, 0);
esis_config_time = newct;
- esis_config();
+ esis_config(NULL);
}
break;
-
+
default:
printf("Unknown ISH option: %x\n", *buf);
}
ESIS_NEXT_OPTION(buf);
}
- new_entry = snpac_add(shp->snh_ifp, nsap, shp->snh_shost, SNPA_IS, ht, 0);
- IFDEBUG(D_ESISINPUT)
- printf("esis_ishinput: nsap %s is %s\n",
- clnp_iso_addrp(nsap), new_entry ? "new" : "old");
- ENDDEBUG
+ new_entry = snpac_add(shp->snh_ifp, nsap, shp->snh_shost, SNPA_IS,
+ ht, 0);
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ESISINPUT]) {
+ printf("esis_ishinput: nsap %s is %s\n",
+ clnp_iso_addrp(nsap), new_entry ? "new" : "old");
+ }
+#endif
if (new_entry)
- esis_shoutput(shp->snh_ifp,
- iso_systype & SNPA_ES ? ESIS_ESH : ESIS_ISH,
- esis_holding_time, shp->snh_shost, 6, (struct iso_addr *)0);
+ esis_shoutput(shp->snh_ifp,
+ iso_systype & SNPA_ES ? ESIS_ESH : ESIS_ISH,
+ esis_holding_time, shp->snh_shost, 6, (struct iso_addr *) 0);
bad:
return;
}
/*
* FUNCTION: esis_rdinput
*
- * PURPOSE: Process an incoming RD pdu
+ * PURPOSE: Process an incoming RD pdu
*
- * RETURNS:
+ * RETURNS:
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
*/
+void
esis_rdinput(m0, shp)
-struct mbuf *m0; /* esh pdu */
-struct snpa_hdr *shp; /* subnetwork header */
+ struct mbuf *m0; /* esh pdu */
+ struct snpa_hdr *shp; /* subnetwork header */
{
- struct esis_fixed *pdu = mtod(m0, struct esis_fixed *);
- u_short ht; /* holding time */
- struct iso_addr *da, *net = 0, *netmask = 0, *snpamask = 0;
+ struct esis_fixed *pdu = mtod(m0, struct esis_fixed *);
+ u_short ht; /* holding time */
+ struct iso_addr *da, *net = 0, *netmask = 0, *snpamask = 0;
register struct iso_addr *bsnpa;
- register u_char *buf = (u_char *)(pdu + 1);
- register u_char *buflim = pdu->esis_hdr_len + (u_char *)pdu;
+ register u_char *buf = (u_char *) (pdu + 1);
+ register u_char *buflim = pdu->esis_hdr_len + (u_char *) pdu;
esis_stat.es_rdrcvd++;
/* Extract NET if present */
if (buf < buflim) {
if (*buf == 0)
- buf++; /* no NET present, skip NETL anyway */
+ buf++; /* no NET present, skip NETL anyway */
else
ESIS_EXTRACT_ADDR(net, buf);
}
-
/* process options */
while (buf < buflim) {
switch (*buf) {
case ESISOVAL_SNPAMASK:
- if (snpamask) /* duplicate */
+ if (snpamask) /* duplicate */
return;
- snpamask = (struct iso_addr *)(buf + 1);
+ snpamask = (struct iso_addr *) (buf + 1);
break;
case ESISOVAL_NETMASK:
- if (netmask) /* duplicate */
+ if (netmask) /* duplicate */
return;
- netmask = (struct iso_addr *)(buf + 1);
+ netmask = (struct iso_addr *) (buf + 1);
break;
default:
ESIS_NEXT_OPTION(buf);
}
- IFDEBUG(D_ESISINPUT)
- printf("esis_rdinput: rd: ht %d, da %s\n", ht, clnp_iso_addrp(da));
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ESISINPUT]) {
+ printf("esis_rdinput: rd: ht %d, da %s\n", ht,
+ clnp_iso_addrp(da));
if (net)
printf("\t: net %s\n", clnp_iso_addrp(net));
- ENDDEBUG
+ }
+#endif
/*
- * If netl is zero, then redirect is to an ES. We need to add an entry
- * to the snpa cache for (destination, better snpa).
- * If netl is not zero, then the redirect is to an IS. In this
- * case, add an snpa cache entry for (net, better snpa).
+ * If netl is zero, then redirect is to an ES. We need to add an entry
+ * to the snpa cache for (destination, better snpa).
+ * If netl is not zero, then the redirect is to an IS. In this
+ * case, add an snpa cache entry for (net, better snpa).
*
- * If the redirect is to an IS, add a route entry towards that
- * IS.
+ * If the redirect is to an IS, add a route entry towards that
+ * IS.
*/
if (net == 0 || net->isoa_len == 0 || snpamask) {
/* redirect to an ES */
snpac_add(shp->snh_ifp, da,
- bsnpa->isoa_genaddr, SNPA_ES, ht, 0);
+ bsnpa->isoa_genaddr, SNPA_ES, ht, 0);
} else {
snpac_add(shp->snh_ifp, net,
- bsnpa->isoa_genaddr, SNPA_IS, ht, 0);
+ bsnpa->isoa_genaddr, SNPA_IS, ht, 0);
snpac_addrt(shp->snh_ifp, da, net, netmask);
}
-bad: ; /* Needed by ESIS_NEXT_OPTION */
+bad: ; /* Needed by ESIS_NEXT_OPTION */
}
/*
* FUNCTION: esis_config
*
- * PURPOSE: Report configuration
+ * PURPOSE: Report configuration
*
- * RETURNS:
+ * RETURNS:
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES: Called every esis_config_time seconds
+ * NOTES: Called every esis_config_time seconds
*/
+/*ARGSUSED*/
void
-esis_config()
+esis_config(v)
+ void *v;
{
- register struct ifnet *ifp;
+ register struct ifnet *ifp;
- timeout(esis_config, (caddr_t)0, hz * esis_config_time);
+ timeout(esis_config, (caddr_t) 0, hz * esis_config_time);
- /*
- * Report configuration for each interface that
- * - is UP
- * - has BROADCAST capability
- * - has an ISO address
+ /*
+ * Report configuration for each interface that - is UP - has
+ * BROADCAST capability - has an ISO address
*/
- /* Todo: a better way would be to construct the esh or ish
- * once and copy it out for all devices, possibly calling
- * a method in the iso_ifaddr structure to encapsulate and
- * transmit it. This could work to advantage for non-broadcast media
+ /*
+ * Todo: a better way would be to construct the esh or ish once and
+ * copy it out for all devices, possibly calling a method in the
+ * iso_ifaddr structure to encapsulate and transmit it. This could
+ * work to advantage for non-broadcast media
*/
-
+
for (ifp = ifnet.tqh_first; ifp != 0; ifp = ifp->if_list.tqe_next) {
if ((ifp->if_flags & IFF_UP) &&
(ifp->if_flags & IFF_BROADCAST)) {
/* search for an ISO address family */
- struct ifaddr *ifa;
+ struct ifaddr *ifa;
for (ifa = ifp->if_addrlist.tqh_first; ifa != 0;
- ifa = ifa->ifa_list.tqe_next) {
+ ifa = ifa->ifa_list.tqe_next) {
if (ifa->ifa_addr->sa_family == AF_ISO) {
- esis_shoutput(ifp,
- iso_systype & SNPA_ES ? ESIS_ESH : ESIS_ISH,
- esis_holding_time,
- (caddr_t)(iso_systype & SNPA_ES ? all_is_snpa :
- all_es_snpa), 6, (struct iso_addr *)0);
+ esis_shoutput(ifp,
+ iso_systype & SNPA_ES ? ESIS_ESH : ESIS_ISH,
+ esis_holding_time,
+ (caddr_t) (iso_systype & SNPA_ES ? all_is_snpa :
+ all_es_snpa), 6, (struct iso_addr *) 0);
break;
}
}
/*
* FUNCTION: esis_shoutput
*
- * PURPOSE: Transmit an esh or ish pdu
+ * PURPOSE: Transmit an esh or ish pdu
*
- * RETURNS: nothing
+ * RETURNS: nothing
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
*/
+void
esis_shoutput(ifp, type, ht, sn_addr, sn_len, isoa)
-struct ifnet *ifp;
-int type;
-short ht;
-caddr_t sn_addr;
-int sn_len;
-struct iso_addr *isoa;
+ struct ifnet *ifp;
+ int type;
+ short ht;
+ caddr_t sn_addr;
+ int sn_len;
+ struct iso_addr *isoa;
{
- struct mbuf *m, *m0;
- caddr_t cp, naddrp;
- int naddr = 0;
- struct esis_fixed *pdu;
- struct iso_ifaddr *ia;
- int len;
- struct sockaddr_iso siso;
+ struct mbuf *m, *m0;
+ caddr_t cp, naddrp;
+ int naddr = 0;
+ struct esis_fixed *pdu;
+ struct iso_ifaddr *ia;
+ int len;
+ struct sockaddr_iso siso;
if (type == ESIS_ESH)
esis_stat.es_eshsent++;
- else if (type == ESIS_ISH)
+ else if (type == ESIS_ISH)
esis_stat.es_ishsent++;
else {
printf("esis_shoutput: bad pdu type\n");
return;
}
- IFDEBUG(D_ESISOUTPUT)
- int i;
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ESISOUTPUT]) {
+ int i;
printf("esis_shoutput: ifp x%x (%s%d), %s, ht %d, to: [%d] ",
- ifp, ifp->if_name, ifp->if_unit, type == ESIS_ESH ? "esh" : "ish",
- ht, sn_len);
- for (i=0; i<sn_len; i++)
- printf("%x%c", *(sn_addr+i), i < (sn_len-1) ? ':' : ' ');
+ (unsigned int) ifp, ifp->if_name, ifp->if_unit,
+ type == ESIS_ESH ? "esh" : "ish",
+ ht, sn_len);
+ for (i = 0; i < sn_len; i++)
+ printf("%x%c", *(sn_addr + i),
+ i < (sn_len - 1) ? ':' : ' ');
printf("\n");
- ENDDEBUG
+ }
+#endif
if ((m0 = m = m_gethdr(M_DONTWAIT, MT_HEADER)) == NULL) {
esis_stat.es_nomem++;
bzero(mtod(m, caddr_t), MHLEN);
pdu = mtod(m, struct esis_fixed *);
- naddrp = cp = (caddr_t)(pdu + 1);
+ naddrp = cp = (caddr_t) (pdu + 1);
len = sizeof(struct esis_fixed);
/*
cp++;
len++;
}
-
m->m_len = len;
if (isoa) {
/*
* It is possible that we did not specifically advertise this
* NSAP, even though it is ours, so we will respond
* directly to the sender that we are here. If we do have
- * multiple NSEL's we'll tack them on so he can compress them out.
+ * multiple NSEL's we'll tack them on so he can compress
+ * them out.
*/
(void) esis_insert_addr(&cp, &len, isoa, m, 0);
naddr = 1;
}
for (ia = iso_ifaddr.tqh_first; ia != 0; ia = ia->ia_list.tqe_next) {
- int nsellen = (type == ESIS_ISH ? ia->ia_addr.siso_tlen : 0);
+ int nsellen = (type == ESIS_ISH ? ia->ia_addr.siso_tlen : 0);
int n = ia->ia_addr.siso_nlen;
register struct iso_ifaddr *ia2;
if (type == ESIS_ISH && naddr > 0)
break;
- for (ia2 = iso_ifaddr.tqh_first; ia2 != ia; ia2 = ia2->ia_list.tqe_next)
- if (Bcmp(ia->ia_addr.siso_data, ia2->ia_addr.siso_data, n) == 0)
+ for (ia2 = iso_ifaddr.tqh_first; ia2 != ia;
+ ia2 = ia2->ia_list.tqe_next)
+ if (Bcmp(ia->ia_addr.siso_data,
+ ia2->ia_addr.siso_data, n) == 0)
break;
if (ia2 != ia)
- continue; /* Means we have previously copied this nsap */
- if (isoa && Bcmp(ia->ia_addr.siso_data, isoa->isoa_genaddr, n) == 0) {
+ continue; /* Means we have previously copied
+ * this nsap */
+ if (isoa && Bcmp(ia->ia_addr.siso_data,
+ isoa->isoa_genaddr, n) == 0) {
isoa = 0;
continue; /* Ditto */
}
- IFDEBUG(D_ESISOUTPUT)
- printf("esis_shoutput: adding NSAP %s\n",
- clnp_iso_addrp(&ia->ia_addr.siso_addr));
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ESISOUTPUT]) {
+ printf("esis_shoutput: adding NSAP %s\n",
+ clnp_iso_addrp(&ia->ia_addr.siso_addr));
+ }
+#endif
if (!esis_insert_addr(&cp, &len,
- &ia->ia_addr.siso_addr, m, nsellen)) {
+ &ia->ia_addr.siso_addr, m, nsellen)) {
EXTEND_PACKET(m, m0, cp);
- (void) esis_insert_addr(&cp, &len, &ia->ia_addr.siso_addr, m,
- nsellen);
+ (void) esis_insert_addr(&cp, &len,
+ &ia->ia_addr.siso_addr, m,
+ nsellen);
}
naddr++;
}
}
*cp++ = ESISOVAL_ESCT;
*cp++ = 2;
- HTOC(*cp, *(cp+1), esis_esconfig_time);
+ HTOC(*cp, *(cp + 1), esis_esconfig_time);
len += 4;
m->m_len += 4;
- IFDEBUG(D_ESISOUTPUT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ESISOUTPUT]) {
printf("m0 0x%x, m 0x%x, data 0x%x, len %d, cp 0x%x\n",
- m0, m, m->m_data, m->m_len, cp);
- ENDDEBUG
+ (unsigned int) m0, (unsigned int) m,
+ (unsigned int) m->m_data, m->m_len,
+ (unsigned int) cp);
+ }
+#endif
}
m0->m_pkthdr.len = len;
pdu->esis_hdr_len = len;
- iso_gen_csum(m0, ESIS_CKSUM_OFF, (int)pdu->esis_hdr_len);
+ iso_gen_csum(m0, ESIS_CKSUM_OFF, (int) pdu->esis_hdr_len);
- bzero((caddr_t)&siso, sizeof(siso));
+ bzero((caddr_t) & siso, sizeof(siso));
siso.siso_family = AF_ISO;
siso.siso_data[0] = AFI_SNA;
siso.siso_nlen = sn_len + 1;
- bcopy(sn_addr, siso.siso_data + 1, (unsigned)sn_len);
- (ifp->if_output)(ifp, m0, sisotosa(&siso), 0);
+ bcopy(sn_addr, siso.siso_data + 1, (unsigned) sn_len);
+ (ifp->if_output) (ifp, m0, sisotosa(&siso), 0);
}
/*
* FUNCTION: isis_input
*
- * PURPOSE: Process an incoming isis packet
+ * PURPOSE: Process an incoming isis packet
*
- * RETURNS: nothing
+ * RETURNS: nothing
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
*/
void
-isis_input(m0, shp)
-struct mbuf *m0; /* ptr to first mbuf of pkt */
-struct snpa_hdr *shp; /* subnetwork header */
+#if __STDC__
+isis_input(struct mbuf *m0, ...)
+#else
+isis_input(m0, va_alist)
+ struct mbuf *m0;
+ va_dcl
+#endif
{
- register int type;
+ struct snpa_hdr *shp; /* subnetwork header */
register struct rawcb *rp, *first_rp = 0;
- struct ifnet *ifp = shp->snh_ifp;
- char workbuf[16];
- struct mbuf *mm;
-
- IFDEBUG(D_ISISINPUT)
- int i;
-
- printf("isis_input: pkt on ifp x%x (%s%d): from:", ifp,
- ifp->if_name, ifp->if_unit);
- for (i=0; i<6; i++)
- printf("%x%c", shp->snh_shost[i]&0xff, (i<5) ? ':' : ' ');
+ struct ifnet *ifp;
+ struct mbuf *mm;
+ va_list ap;
+
+ va_start(ap, m0);
+ shp = va_arg(ap, struct snpa_hdr *);
+ va_end(ap);
+ ifp = shp->snh_ifp;
+
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ISISINPUT]) {
+ int i;
+
+ printf("isis_input: pkt on ifp x%x (%s%d): from:",
+ (unsigned int) ifp,
+ ifp->if_name, ifp->if_unit);
+ for (i = 0; i < 6; i++)
+ printf("%x%c", shp->snh_shost[i] & 0xff,
+ (i < 5) ? ':' : ' ');
printf(" to:");
- for (i=0; i<6; i++)
- printf("%x%c", shp->snh_dhost[i]&0xff, (i<5) ? ':' : ' ');
+ for (i = 0; i < 6; i++)
+ printf("%x%c", shp->snh_dhost[i] & 0xff,
+ (i < 5) ? ':' : ' ');
printf("\n");
- ENDDEBUG
+ }
+#endif
esis_dl.sdl_alen = ifp->if_addrlen;
esis_dl.sdl_index = ifp->if_index;
- bcopy(shp->snh_shost, (caddr_t)esis_dl.sdl_data, esis_dl.sdl_alen);
+ bcopy(shp->snh_shost, (caddr_t) esis_dl.sdl_data, esis_dl.sdl_alen);
for (rp = esis_pcb.lh_first; rp != 0; rp = rp->rcb_list.le_next) {
if (first_rp == 0) {
first_rp = rp;
continue;
}
- if (mm = m_copy(m0, 0, M_COPYALL)) { /*can't block at interrupt level */
+ /* can't block at interrupt level */
+ if ((mm = m_copy(m0, 0, M_COPYALL)) != NULL) {
if (sbappendaddr(&rp->rcb_socket->so_rcv,
- (struct sockaddr *)&esis_dl, mm,
- (struct mbuf *)0) != 0) {
+ (struct sockaddr *) & esis_dl, mm,
+ (struct mbuf *) 0) != 0) {
sorwakeup(rp->rcb_socket);
- } else {
- IFDEBUG(D_ISISINPUT)
- printf("Error in sbappenaddr, mm = 0x%x\n", mm);
- ENDDEBUG
+ } else {
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ISISINPUT]) {
+ printf(
+ "Error in sbappenaddr, mm = 0x%x\n",
+ (unsigned int) mm);
+ }
+#endif
m_freem(mm);
}
}
}
if (first_rp && sbappendaddr(&first_rp->rcb_socket->so_rcv,
- (struct sockaddr *)&esis_dl, m0, (struct mbuf *)0) != 0) {
+ (struct sockaddr *) & esis_dl, m0, (struct mbuf *) 0) != 0) {
sorwakeup(first_rp->rcb_socket);
return;
}
m_freem(m0);
}
-isis_output(sdl, m)
-register struct sockaddr_dl *sdl;
-struct mbuf *m;
+int
+#if __STDC__
+isis_output(struct mbuf *m, ...)
+#else
+isis_output(m, va_alist)
+ struct mbuf *m;
+ va_dcl
+#endif
{
+ register struct sockaddr_dl *sdl;
register struct ifnet *ifp;
- struct ifaddr *ifa, *ifa_ifwithnet();
+ struct ifaddr *ifa;
struct sockaddr_iso siso;
- int error = 0;
- unsigned sn_len;
+ int error = 0;
+ unsigned sn_len;
+ va_list ap;
- ifa = ifa_ifwithnet((struct sockaddr *)sdl); /* get ifp from sdl */
+ va_start(ap, m);
+ sdl = va_arg(ap, struct sockaddr_dl *);
+ va_end(ap);
+
+ ifa = ifa_ifwithnet((struct sockaddr *) sdl); /* get ifp from sdl */
if (ifa == 0) {
- IFDEBUG(D_ISISOUTPUT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ISISOUTPUT]) {
printf("isis_output: interface not found\n");
- ENDDEBUG
+ }
+#endif
error = EINVAL;
goto release;
}
ifp = ifa->ifa_ifp;
sn_len = sdl->sdl_alen;
- IFDEBUG(D_ISISOUTPUT)
- u_char *cp = (u_char *)LLADDR(sdl), *cplim = cp + sn_len;
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ISISOUTPUT]) {
+ u_char *cp = (u_char *) LLADDR(sdl), *cplim = cp + sn_len;
printf("isis_output: ifp 0x%x (%s%d), to: ",
- ifp, ifp->if_name, ifp->if_unit);
+ (unsigned int) ifp, ifp->if_name, ifp->if_unit);
while (cp < cplim) {
printf("%x", *cp++);
printf("%c", (cp < cplim) ? ':' : ' ');
}
printf("\n");
- ENDDEBUG
- bzero((caddr_t)&siso, sizeof(siso));
- siso.siso_family = AF_ISO; /* This convention may be useful for X.25 */
+ }
+#endif
+ bzero((caddr_t) & siso, sizeof(siso));
+ siso.siso_family = AF_ISO; /* This convention may be useful for
+ * X.25 */
siso.siso_data[0] = AFI_SNA;
siso.siso_nlen = sn_len + 1;
bcopy(LLADDR(sdl), siso.siso_data + 1, sn_len);
- error = (ifp->if_output)(ifp, m, sisotosa(&siso), 0);
+ error = (ifp->if_output) (ifp, m, sisotosa(&siso), 0);
if (error) {
- IFDEBUG(D_ISISOUTPUT)
- printf("isis_output: error from ether_output is %d\n", error);
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ISISOUTPUT]) {
+ printf("isis_output: error from ether_output is %d\n",
+ error);
+ }
+#endif
}
return (error);
release:
if (m != NULL)
m_freem(m);
- return(error);
+ return (error);
}
/*
* FUNCTION: esis_ctlinput
*
- * PURPOSE: Handle the PRC_IFDOWN transition
+ * PURPOSE: Handle the PRC_IFDOWN transition
*
- * RETURNS: nothing
+ * RETURNS: nothing
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES: Calls snpac_flush for interface specified.
- * The loop through iso_ifaddr is stupid because
- * back in if_down, we knew the ifp...
+ * NOTES: Calls snpac_flush for interface specified.
+ * The loop through iso_ifaddr is stupid because
+ * back in if_down, we knew the ifp...
*/
-void
-esis_ctlinput(req, siso)
-int req; /* request: we handle only PRC_IFDOWN */
-struct sockaddr_iso *siso; /* address of ifp */
+void *
+esis_ctlinput(req, siso, dummy)
+ int req; /* request: we handle only PRC_IFDOWN */
+ struct sockaddr *siso; /* address of ifp */
+ void *dummy;
{
register struct iso_ifaddr *ia; /* scan through interface addresses */
if (req == PRC_IFDOWN)
- for (ia = iso_ifaddr.tqh_first; ia != 0; ia = ia->ia_list.tqe_next) {
- if (iso_addrmatch(IA_SIS(ia), siso))
+ for (ia = iso_ifaddr.tqh_first; ia != 0;
+ ia = ia->ia_list.tqe_next) {
+ if (iso_addrmatch(IA_SIS(ia),
+ (struct sockaddr_iso *) siso))
snpac_flushifp(ia->ia_ifp);
}
+ return NULL;
}
-#endif /* ISO */
+#endif /* ISO */
-/* $NetBSD: esis.h,v 1.8 1995/03/29 22:09:46 briggs Exp $ */
+/* $OpenBSD: esis.h,v 1.2 1996/03/04 10:35:18 mickey Exp $ */
+/* $NetBSD: esis.h,v 1.9 1996/02/13 22:09:29 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
#include <machine/endian.h>
-#define SNPAC_AGE 60 /* seconds */
-#define ESIS_CONFIG 60 /* seconds */
+#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 */
+ 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 */
};
/*
* 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 ESISOVAL_ESCT 0xc6 /* end system conf. timer, ISH PDU
+ * only */
#define ESIS_CKSUM_OFF 0x07
#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 */
+ 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;
-#endif /* _KERNEL */
+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 *));
+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 */
-/* $NetBSD: idrp_usrreq.c,v 1.4 1995/08/12 23:59:47 mycroft Exp $ */
+/* $OpenBSD: idrp_usrreq.c,v 1.2 1996/03/04 10:35:20 mickey Exp $ */
+/* $NetBSD: idrp_usrreq.c,v 1.5 1996/02/13 22:09:33 christos Exp $ */
/*
* Copyright (c) 1992, 1993
#include <netiso/clnl.h>
#include <netiso/iso_pcb.h>
#include <netiso/iso_var.h>
+#include <netiso/idrp_var.h>
-void idrp_input();
-struct isopcb idrp_isop;
-static struct sockaddr_iso idrp_addrs[2] =
-{ { sizeof(idrp_addrs), AF_ISO, }, { sizeof(idrp_addrs[1]), AF_ISO, } };
+#include <machine/stdarg.h>
+
+struct isopcb idrp_isop;
+static struct sockaddr_iso idrp_addrs[2] =
+{{sizeof(idrp_addrs), AF_ISO,}, {sizeof(idrp_addrs[1]), AF_ISO,}};
/*
* IDRP initialization
* FUNCTION and ARGUMENTS:
* Take a packet (m) from clnp, strip off the clnp header
* and mke suitable for the idrp socket.
- * No return value.
+ * No return value.
*/
void
-idrp_input(m, src, dst)
- register struct mbuf *m;
- struct sockaddr_iso *src, *dst;
+#if __STDC__
+idrp_input(struct mbuf *m, ...)
+#else
+idrp_input(m, va_alist)
+ struct mbuf *m;
+ va_dcl
+#endif
{
+ struct sockaddr_iso *src, *dst;
+ va_list ap;
+
+ va_start(ap, m);
+ src = va_arg(ap, struct sockaddr_iso *);
+ dst = va_arg(ap, struct sockaddr_iso *);
+ va_end(ap);
+
if (idrp_isop.isop_socket == 0) {
- bad: m_freem(m);
+bad: m_freem(m);
return;
}
bzero(idrp_addrs[0].siso_data, sizeof(idrp_addrs[0].siso_data));
- bcopy((caddr_t)&(src->siso_addr), (caddr_t)&idrp_addrs[0].siso_addr,
- 1 + src->siso_nlen);
+ bcopy((caddr_t) & (src->siso_addr), (caddr_t) & idrp_addrs[0].siso_addr,
+ 1 + src->siso_nlen);
bzero(idrp_addrs[1].siso_data, sizeof(idrp_addrs[1].siso_data));
- bcopy((caddr_t)&(dst->siso_addr), (caddr_t)&idrp_addrs[1].siso_addr,
- 1 + dst->siso_nlen);
+ bcopy((caddr_t) & (dst->siso_addr), (caddr_t) & idrp_addrs[1].siso_addr,
+ 1 + dst->siso_nlen);
if (sbappendaddr(&idrp_isop.isop_socket->so_rcv,
- sisotosa(idrp_addrs), m, (struct mbuf *)0) == 0)
+ sisotosa(idrp_addrs), m, (struct mbuf *) 0) == 0)
goto bad;
sorwakeup(idrp_isop.isop_socket);
}
-idrp_output(m, addr)
- struct mbuf *m, *addr;
+int
+#if __STDC__
+idrp_output(struct mbuf *m, ...)
+#else
+idrp_output(m, va_alist)
+ struct mbuf *m;
+ va_dcl
+#endif
{
- register struct sockaddr_iso *siso = mtod(addr, struct sockaddr_iso *);
- int s = splsoftnet(), i;
-
- bcopy((caddr_t)&(siso->siso_addr),
- (caddr_t)&idrp_isop.isop_sfaddr.siso_addr, 1 + siso->siso_nlen);
+ struct mbuf *addr;
+ register struct sockaddr_iso *siso;
+ int s = splsoftnet(), i;
+ va_list ap;
+ va_start(ap, m);
+ addr = va_arg(ap, struct mbuf *);
+ va_end(ap);
+ siso = mtod(addr, struct sockaddr_iso *);
+
+ bcopy((caddr_t) & (siso->siso_addr),
+ (caddr_t) & idrp_isop.isop_sfaddr.siso_addr, 1 + siso->siso_nlen);
siso++;
- bcopy((caddr_t)&(siso->siso_addr),
- (caddr_t)&idrp_isop.isop_sladdr.siso_addr, 1 + siso->siso_nlen);
+ bcopy((caddr_t) & (siso->siso_addr),
+ (caddr_t) & idrp_isop.isop_sladdr.siso_addr, 1 + siso->siso_nlen);
i = clnp_output(m, idrp_isop, m->m_pkthdr.len, 0);
splx(s);
return (i);
}
-u_long idrp_sendspace = 3072; /* really max datagram size */
-u_long idrp_recvspace = 40 * 1024; /* 40 1K datagrams */
+u_long idrp_sendspace = 3072; /* really max datagram size */
+u_long idrp_recvspace = 40 * 1024; /* 40 1K datagrams */
-/*ARGSUSED*/
+/* ARGSUSED */
+int
idrp_usrreq(so, req, m, addr, control)
- struct socket *so;
- int req;
- struct mbuf *m, *addr, *control;
+ struct socket *so;
+ int req;
+ struct mbuf *m, *addr, *control;
{
- int error = 0;
+ int error = 0;
- /* Note: need to block idrp_input while changing
- * the udp pcb queue and/or pcb addresses.
+ /*
+ * Note: need to block idrp_input while changing the udp pcb queue
+ * and/or pcb addresses.
*/
switch (req) {
return (EOPNOTSUPP); /* do not free mbuf's */
}
-release:
if (control) {
printf("idrp control data unexpectedly retained\n");
m_freem(control);
-/* $NetBSD: if_cons.c,v 1.6 1995/03/28 20:01:29 jtc Exp $ */
+/* $OpenBSD: if_cons.c,v 1.2 1996/03/04 10:35:21 mickey Exp $ */
+/* $NetBSD: if_cons.c,v 1.7 1996/02/13 22:09:44 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
*/
/*
* cons.c - Connection Oriented Network Service:
- * including support for a) user transport-level service,
+ * including support for a) user transport-level service,
* b) COSNS below CLNP, and c) CONS below TP.
*/
#ifdef TPCONS
#ifdef _KERNEL
#ifdef ARGO_DEBUG
-#define Static
-unsigned LAST_CALL_PCB;
-#else /* ARGO_DEBUG */
+#define Static
+unsigned LAST_CALL_PCB;
+#else /* ARGO_DEBUG */
#define Static static
-#endif /* ARGO_DEBUG */
+#endif /* ARGO_DEBUG */
#ifndef SOCK_STREAM
#include <sys/param.h>
#include <sys/socketvar.h>
#include <sys/errno.h>
#include <sys/ioctl.h>
-#include <sys/tsleep.h>
#include <net/if.h>
#include <net/netisr.h>
#include <netiso/iso.h>
#include <netiso/cons.h>
#include <netiso/iso_pcb.h>
+#include <netiso/iso_var.h>
+#include <netiso/tp_var.h>
+#include <netiso/clnp.h>
#include <netccitt/x25.h>
#include <netccitt/pk.h>
#include <netccitt/pk_var.h>
+#include <netccitt/pk_extern.h>
#endif
#ifdef ARGO_DEBUG
#define MT_XCONFIRM MT_DATA
#define MT_XDATA MT_DATA
#define MT_XHEADER MT_HEADER
-#endif /* ARGO_DEBUG */
+#endif /* ARGO_DEBUG */
#define DONTCLEAR -1
-/*********************************************************************
+/*********************************************************************
* cons.c - CONS interface to the x.25 layer
*
* TODO: figure out what resources we might run out of besides mbufs.
* lru x% of the connections, for some parameter x.
*
* There are 2 interfaces from above:
- * 1) from TP0:
+ * 1) from TP0:
* cons CO network service
* TP associates a transport connection with a network connection.
- * cons_output( isop, m, len, isdgm==0 )
+ * cons_output( isop, m, len, isdgm==0 )
* co_flags == 0
* 2) from TP4:
* It's a datagram service, like clnp is. - even though it calls
- * cons_output( isop, m, len, isdgm==1 )
+ * cons_output( isop, m, len, isdgm==1 )
* it eventually goes through
* cosns_output(ifp, m, dst).
- * TP4 permits multiplexing (reuse, possibly simultaneously) of the
+ * TP4 permits multiplexing (reuse, possibly simultaneously) of the
* network connections.
* This means that many sockets (many tpcbs) may be associated with
* this pklcd, hence cannot have a back ptr from pklcd to a tpcb.
- * co_flags & CONSF_DGM
+ * co_flags & CONSF_DGM
* co_socket is null since there may be many sockets that use this pklcd.
+ * NOTE:
+ * streams would really be nice. sigh.
+ * NOTE:
+ * PVCs could be handled by config-ing a cons with an address and with the
+ * IFF_POINTTOPOINT flag on. This code would then have to skip the
+ * connection setup stuff for pt-to-pt links.
*
-NOTE:
- streams would really be nice. sigh.
-NOTE:
- PVCs could be handled by config-ing a cons with an address and with the
- IFF_POINTTOPOINT flag on. This code would then have to skip the
- connection setup stuff for pt-to-pt links.
-
-
*********************************************************************/
#define CONS_IFQMAXLEN 5
+Static int make_partial_x25_packet __P((struct isopcb *, struct pklcd *));
+Static int NSAPtoDTE __P((struct sockaddr_iso *, struct sockaddr_x25 *));
+Static int FACILtoNSAP __P((struct sockaddr_iso *, u_char *));
+Static void init_siso __P((struct sockaddr_iso *));
+Static int DTEtoNSAP __P((struct sockaddr_iso *, struct sockaddr_x25 *));
+Static int parse_facil __P((struct pklcd *, struct isopcb *, caddr_t, u_char));
/* protosw pointers for getting to higher layer */
-Static struct protosw *CLNP_proto;
-Static struct protosw *TP_proto;
-Static struct protosw *X25_proto;
-Static int issue_clear_req();
-
-#ifndef PHASEONE
-extern struct ifaddr *ifa_ifwithnet();
-#endif /* PHASEONE */
-
-extern struct ifaddr *ifa_ifwithaddr();
+Static struct protosw *CLNP_proto;
+Static struct protosw *TP_proto;
+Static struct protosw *X25_proto;
-extern struct isopcb tp_isopcb; /* chain of all TP pcbs */
+extern struct isopcb tp_isopcb; /* chain of all TP pcbs */
-Static int parse_facil(), NSAPtoDTE(), make_partial_x25_packet();
-Static int FACILtoNSAP(), DTEtoNSAP();
-Static struct pklcd *cons_chan_to_pcb();
-
#define HIGH_NIBBLE 1
#define LOW_NIBBLE 0
*/
void
nibble_copy(src_octet, src_nibble, dst_octet, dst_nibble, len)
- register char *src_octet;
- register char *dst_octet;
- register unsigned src_nibble;
- register unsigned dst_nibble;
- int len;
+ register char *src_octet;
+ register char *dst_octet;
+ register unsigned src_nibble;
+ register unsigned dst_nibble;
+ int len;
{
- register i;
- register unsigned dshift, sshift;
+ register i;
+ register unsigned dshift, sshift;
- IFDEBUG(D_CADDR)
- printf("nibble_copy ( 0x%x, 0x%x, 0x%x, 0x%x 0x%x)\n",
- src_octet, src_nibble, dst_octet, dst_nibble, len);
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CADDR]) {
+ printf("nibble_copy ( 0x%x, 0x%x, 0x%x, 0x%x 0x%x)\n",
+ src_octet, src_nibble, dst_octet, dst_nibble, len);
+ }
+#endif
#define SHIFT 0x4
dshift = dst_nibble << 2;
sshift = src_nibble << 2;
- for (i=0; i<len; i++) {
+ for (i = 0; i < len; i++) {
/* clear dst_nibble */
- *dst_octet &= ~(0xf<< dshift);
+ *dst_octet &= ~(0xf << dshift);
/* set dst nibble */
- *dst_octet |= ( 0xf & (*src_octet >> sshift))<< dshift;
-
- dshift ^= SHIFT;
- sshift ^= SHIFT;
- src_nibble = 1-src_nibble;
- dst_nibble = 1-dst_nibble;
- src_octet += src_nibble;
- dst_octet += dst_nibble;
+ *dst_octet |= (0xf & (*src_octet >> sshift)) << dshift;
+
+ dshift ^= SHIFT;
+ sshift ^= SHIFT;
+ src_nibble = 1 - src_nibble;
+ dst_nibble = 1 - dst_nibble;
+ src_octet += src_nibble;
+ dst_octet += dst_nibble;
}
- IFDEBUG(D_CADDR)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CADDR]) {
printf("nibble_copy DONE\n");
- ENDDEBUG
+ }
+#endif
}
/*
* RETURNS: 0 if they differ, 1 if they are the same.
*/
int
-nibble_match( src_octet, src_nibble, dst_octet, dst_nibble, len)
- register char *src_octet;
- register char *dst_octet;
- register unsigned src_nibble;
- register unsigned dst_nibble;
- int len;
+nibble_match(src_octet, src_nibble, dst_octet, dst_nibble, len)
+ register char *src_octet;
+ register char *dst_octet;
+ register unsigned src_nibble;
+ register unsigned dst_nibble;
+ int len;
{
- register i;
- register unsigned dshift, sshift;
- u_char nibble_a, nibble_b;
+ register i;
+ register unsigned dshift, sshift;
+ u_char nibble_a, nibble_b;
- IFDEBUG(D_CADDR)
- printf("nibble_match ( 0x%x, 0x%x, 0x%x, 0x%x 0x%x)\n",
- src_octet, src_nibble, dst_octet, dst_nibble, len);
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CADDR]) {
+ printf("nibble_match ( 0x%x, 0x%x, 0x%x, 0x%x 0x%x)\n",
+ src_octet, src_nibble, dst_octet, dst_nibble, len);
+ }
+#endif
#define SHIFT 0x4
dshift = dst_nibble << 2;
sshift = src_nibble << 2;
- for (i=0; i<len; i++) {
- nibble_b = ((*dst_octet)>>dshift) & 0xf;
- nibble_a = ( 0xf & (*src_octet >> sshift));
+ for (i = 0; i < len; i++) {
+ nibble_b = ((*dst_octet) >> dshift) & 0xf;
+ nibble_a = (0xf & (*src_octet >> sshift));
if (nibble_b != nibble_a)
return 0;
- dshift ^= SHIFT;
- sshift ^= SHIFT;
- src_nibble = 1-src_nibble;
- dst_nibble = 1-dst_nibble;
- src_octet += src_nibble;
- dst_octet += dst_nibble;
+ dshift ^= SHIFT;
+ sshift ^= SHIFT;
+ src_nibble = 1 - src_nibble;
+ dst_nibble = 1 - dst_nibble;
+ src_octet += src_nibble;
+ dst_octet += dst_nibble;
}
- IFDEBUG(D_CADDR)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CADDR]) {
printf("nibble_match DONE\n");
- ENDDEBUG
+ }
+#endif
return 1;
}
void
cons_init()
{
- int tp_incoming(), clnp_incoming();
-
-
- CLNP_proto = pffindproto(AF_ISO, ISOPROTO_CLNP, SOCK_DGRAM);
+ CLNP_proto = pffindproto(AF_ISO, ISOPROTO_CLNP, SOCK_DGRAM);
X25_proto = pffindproto(AF_ISO, ISOPROTO_X25, SOCK_STREAM);
TP_proto = pffindproto(AF_ISO, ISOPROTO_TP0, SOCK_SEQPACKET);
- IFDEBUG(D_CCONS)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CCONS]) {
printf("cons_init end : cnlp_proto 0x%x cons proto 0x%x tp proto 0x%x\n",
- CLNP_proto, X25_proto, TP_proto);
- ENDDEBUG
+ CLNP_proto, X25_proto, TP_proto);
+ }
+#endif
#ifdef notdef
pk_protolisten(0x81, 0, clnp_incoming);
pk_protolisten(0x82, 0, esis_incoming);
#endif
}
-tp_incoming(lcp, m)
-struct pklcd *lcp;
-register struct mbuf *m;
+int
+tp_incoming(m, v)
+ register struct mbuf *m;
+ void *v;
{
+ struct pklcd *lcp = v;
register struct isopcb *isop;
- int cons_tpinput();
- if (iso_pcballoc((struct socket *)0, &tp_isopcb)) {
+ if (iso_pcballoc(NULL, &tp_isopcb)) {
pk_close(lcp);
- return;
+ return 0;
}
isop = tp_isopcb.isop_next;
lcp->lcd_upper = cons_tpinput;
- lcp->lcd_upnext = (caddr_t)isop;
- lcp->lcd_send(lcp); /* Confirms call */
- isop->isop_chan = (caddr_t)lcp;
+ lcp->lcd_upnext = (caddr_t) isop;
+ lcp->lcd_send(lcp); /* Confirms call */
+ isop->isop_chan = (caddr_t) lcp;
isop->isop_laddr = &isop->isop_sladdr;
isop->isop_faddr = &isop->isop_sfaddr;
DTEtoNSAP(isop->isop_laddr, &lcp->lcd_laddr);
DTEtoNSAP(isop->isop_faddr, &lcp->lcd_faddr);
parse_facil(lcp, isop, &(mtod(m, struct x25_packet *)->packet_data),
- m->m_pkthdr.len - PKHEADERLN);
+ m->m_pkthdr.len - PKHEADERLN);
+ return 0;
}
-cons_tpinput(lcp, m0)
-struct mbuf *m0;
-struct pklcd *lcp;
+int
+cons_tpinput(m0, v)
+ struct mbuf *m0;
+ void *v;
{
- register struct isopcb *isop = (struct isopcb *)lcp->lcd_upnext;
- register struct x25_packet *xp;
- int cmd, ptype = CLEAR;
+ struct pklcd *lcp = v;
+ register struct isopcb *isop = (struct isopcb *) lcp->lcd_upnext;
+ int cmd, ptype = PK_CLEAR;
if (isop == 0)
- return;
+ return 0;
if (m0 == 0)
goto dead;
- switch(m0->m_type) {
+ switch (m0->m_type) {
case MT_DATA:
case MT_OOBDATA:
- tpcons_input(m0, isop->isop_faddr, isop->isop_laddr, (caddr_t)lcp);
- return;
+ tpcons_input(m0, isop->isop_faddr, isop->isop_laddr,
+ (caddr_t) lcp);
+ return 0;
case MT_CONTROL:
switch (ptype = pk_decode(mtod(m0, struct x25_packet *))) {
- case RR:
+ case PK_RR:
cmd = PRC_CONS_SEND_DONE;
break;
- case CALL_ACCEPTED:
+ case PK_CALL_ACCEPTED:
if (lcp->lcd_sb.sb_mb)
- lcp->lcd_send(lcp); /* XXX - fix this */
- /*FALLTHROUGH*/
+ lcp->lcd_send(lcp); /* XXX - fix this */
+ /* FALLTHROUGH */
default:
- return;
+ return 0;
- dead:
- case CLEAR:
- case CLEAR_CONF:
+ dead:
+ case PK_CLEAR:
+ case PK_CLEAR_CONF:
lcp->lcd_upper = 0;
lcp->lcd_upnext = 0;
isop->isop_chan = 0;
- case RESET:
+ case PK_RESET:
cmd = PRC_ROUTEDEAD;
}
- tpcons_ctlinput(cmd, isop->isop_faddr, isop);
- if (cmd = PRC_ROUTEDEAD && isop->isop_refcnt == 0)
+ tpcons_ctlinput(cmd, (struct sockaddr *) isop->isop_faddr,
+ isop);
+ if (cmd == PRC_ROUTEDEAD && isop->isop_refcnt == 0)
iso_pcbdetach(isop);
}
+ return 0;
}
/*
* NAME: cons_connect()
* CALLED FROM:
- * tpcons_pcbconnect() when opening a new connection.
+ * tpcons_pcbconnect() when opening a new connection.
* FUNCTION anD ARGUMENTS:
* Figures out which device to use, finding a route if one doesn't
* already exist.
* RETURN VALUE:
* returns E*
*/
+int
cons_connect(isop)
register struct isopcb *isop;
{
- register struct pklcd *lcp = (struct pklcd *)isop->isop_chan;
- register struct mbuf *m;
- struct ifaddr *ifa;
- int error;
+ register struct pklcd *lcp = (struct pklcd *) isop->isop_chan;
+ int error;
- IFDEBUG(D_CCONN)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CCONN]) {
printf("cons_connect(0x%x): ", isop);
dump_isoaddr(isop->isop_faddr);
printf("myaddr: ");
dump_isoaddr(isop->isop_laddr);
- printf("\n" );
- ENDDEBUG
+ printf("\n");
+ }
+#endif
NSAPtoDTE(isop->isop_faddr, &lcp->lcd_faddr);
lcp->lcd_upper = cons_tpinput;
- lcp->lcd_upnext = (caddr_t)isop;
- IFDEBUG(D_CCONN)
+ lcp->lcd_upnext = (caddr_t) isop;
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CCONN]) {
printf(
- "calling make_partial_x25_packet( 0x%x, 0x%x, 0x%x)\n",
- &lcp->lcd_faddr, &lcp->lcd_laddr,
- isop->isop_socket->so_proto->pr_protocol);
- ENDDEBUG
- if ((error = make_partial_x25_packet(isop, lcp, m)) == 0)
+ "calling make_partial_x25_packet( 0x%x, 0x%x, 0x%x)\n",
+ &lcp->lcd_faddr, &lcp->lcd_laddr,
+ isop->isop_socket->so_proto->pr_protocol);
+ }
+#endif
+ if ((error = make_partial_x25_packet(isop, lcp)) == 0)
error = pk_connect(lcp, &lcp->lcd_faddr);
return error;
}
*/
-/*
- * NAME: cons_ctlinput()
- * CALLED FROM:
- * lower layer when ECN_CLEAR occurs : this routine is here
- * for consistency - cons subnet service calls its higher layer
- * through the protosw entry.
- * FUNCTION & ARGUMENTS:
- * cmd is a PRC_* command, list found in ../sys/protosw.h
- * copcb is the obvious.
- * This serves the higher-layer cons service.
- * NOTE: this takes 3rd arg. because cons uses it to inform itself
- * of things (timeouts, etc) but has a pcb instead of an address.
+/*
+ * NAME: cons_ctlinput() CALLED FROM: lower layer when ECN_CLEAR
+ * occurs : this routine is here for consistency - cons subnet service calls
+ * its higher layer through the protosw entry. FUNCTION & ARGUMENTS: cmd is a
+ * PRC_* command, list found in ../sys/protosw.h copcb is the obvious. This
+ * serves the higher-layer cons service. NOTE: this takes 3rd arg. because
+ * cons uses it to inform itself of things (timeouts, etc) but has a pcb
+ * instead of an address.
*/
-void
-cons_ctlinput(cmd, sa, copcb)
- int cmd;
+void *
+cons_ctlinput(cmd, sa, v)
+ int cmd;
struct sockaddr *sa;
- register struct pklcd *copcb;
+ void *v;
{
+ return NULL;
}
-find_error_reason( xp )
+int
+find_error_reason(xp)
register struct x25_packet *xp;
{
- extern u_char x25_error_stats[];
- int error, cause;
+ int error, cause = 0;
if (xp) {
- cause = 4[(char *)xp];
+ cause = 4[(char *) xp];
switch (cause) {
- case 0x00:
- case 0x80:
- /* DTE originated; look at the diagnostic */
- error = (CONL_ERROR_MASK | cause);
- goto done;
-
- case 0x01: /* number busy */
- case 0x81:
- case 0x09: /* Out of order */
- case 0x89:
- case 0x11: /* Remot Procedure Error */
- case 0x91:
- case 0x19: /* reverse charging accept not subscribed */
- case 0x99:
- case 0x21: /* Incampat destination */
- case 0xa1:
- case 0x29: /* fast select accept not subscribed */
- case 0xa9:
- case 0x39: /* ship absent */
- case 0xb9:
- case 0x03: /* invalid facil request */
- case 0x83:
- case 0x0b: /* access barred */
- case 0x8b:
- case 0x13: /* local procedure error */
- case 0x93:
- case 0x05: /* network congestion */
- case 0x85:
- case 0x8d: /* not obtainable */
- case 0x0d:
- case 0x95: /* RPOA out of order */
- case 0x15:
- /* take out bit 8
- * so we don't have to have so many perror entries
- */
- error = (CONL_ERROR_MASK | 0x100 | (cause & ~0x80));
- goto done;
-
- case 0xc1: /* gateway-detected proc error */
- case 0xc3: /* gateway congestion */
-
- error = (CONL_ERROR_MASK | 0x100 | cause);
- goto done;
- }
- }
+ case 0x00:
+ case 0x80:
+ /* DTE originated; look at the diagnostic */
+ error = (CONL_ERROR_MASK | cause);
+ goto done;
+
+ case 0x01: /* number busy */
+ case 0x81:
+ case 0x09: /* Out of order */
+ case 0x89:
+ case 0x11: /* Remot Procedure Error */
+ case 0x91:
+ case 0x19: /* reverse charging accept not subscribed */
+ case 0x99:
+ case 0x21: /* Incampat destination */
+ case 0xa1:
+ case 0x29: /* fast select accept not subscribed */
+ case 0xa9:
+ case 0x39: /* ship absent */
+ case 0xb9:
+ case 0x03: /* invalid facil request */
+ case 0x83:
+ case 0x0b: /* access barred */
+ case 0x8b:
+ case 0x13: /* local procedure error */
+ case 0x93:
+ case 0x05: /* network congestion */
+ case 0x85:
+ case 0x8d: /* not obtainable */
+ case 0x0d:
+ case 0x95: /* RPOA out of order */
+ case 0x15:
+ /*
+ * take out bit 8 so we don't have to have so many
+ * perror entries
+ */
+ error = (CONL_ERROR_MASK | 0x100 | (cause & ~0x80));
+ goto done;
+
+ case 0xc1: /* gateway-detected proc error */
+ case 0xc3: /* gateway congestion */
+
+ error = (CONL_ERROR_MASK | 0x100 | cause);
+ goto done;
+ }
+ }
/* otherwise, a *hopefully* valid perror exists in the e_reason field */
error = xp->packet_data;
- if (error = 0) {
+ if (error == 0) {
printf("Incoming PKT TYPE 0x%x with reason 0x%x\n",
- pk_decode(xp),
- cause);
+ pk_decode(xp),
+ cause);
error = E_CO_HLI_DISCA;
- }
-
+ }
done:
return error;
}
-#endif /* _KERNEL */
+#endif /* _KERNEL */
/*
* NAME: make_partial_x25_packet()
* m+1 facil param len (for >2-byte facilities) in octets
* m+2..p facil param field
* q user data (protocol identification octet)
- *
*
- * RETURNS:
+ *
+ * RETURNS:
* 0 if OK
* E* if failed.
*
* routine knows where to look for it.
*/
-#ifdef X25_1984
-int cons_use_facils = 1;
+#ifdef X25_1984
+int cons_use_facils = 1;
#else /* X25_1984 */
-int cons_use_facils = 0;
+int cons_use_facils = 0;
#endif /* X25_1984 */
-int cons_use_udata = 1; /* KLUDGE FOR DEBUGGING */
+int cons_use_udata = 1; /* KLUDGE FOR DEBUGGING */
Static int
make_partial_x25_packet(isop, lcp)
- struct isopcb *isop;
- struct pklcd *lcp;
+ struct isopcb *isop;
+ struct pklcd *lcp;
{
- u_int proto;
- int flag;
- caddr_t buf;
- register caddr_t ptr;
- register int len = 0;
- int buflen =0;
- caddr_t facil_len;
- int oddness = 0;
- struct mbuf *m;
-
-
- IFDEBUG(D_CCONN)
+ u_int proto = 0;
+ int flag = 0;
+ caddr_t buf;
+ register caddr_t ptr;
+ register int len = 0;
+ int buflen = 0;
+ caddr_t facil_len;
+ struct mbuf *m = NULL;
+
+
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CCONN]) {
printf("make_partial_x25_packet(0x%x, 0x%x, 0x%x, 0x%x, 0x%x)\n",
- isop->isop_laddr, isop->isop_faddr, proto, m, flag);
- ENDDEBUG
+ isop->isop_laddr, isop->isop_faddr, proto, m, flag);
+ }
+#endif
if (cons_use_udata) {
if (isop->isop_x25crud_len > 0) {
/*
* The user specified something. Stick it in
*/
bcopy(isop->isop_x25crud, lcp->lcd_faddr.x25_udata,
- isop->isop_x25crud_len);
+ isop->isop_x25crud_len);
lcp->lcd_faddr.x25_udlen = isop->isop_x25crud_len;
}
}
-
if (cons_use_facils == 0) {
lcp->lcd_facilities = 0;
return 0;
return ENOBUFS;
buf = mtod(m, caddr_t);
ptr = buf;
-
+
/* ptr now points to facil length (len of whole facil field in OCTETS */
- facil_len = ptr ++;
+ facil_len = ptr++;
m->m_len = 0;
pk_build_facilities(m, &lcp->lcd_faddr, 0);
- IFDEBUG(D_CADDR)
- printf("make_partial calling: ptr 0x%x, len 0x%x\n", ptr,
- isop->isop_laddr->siso_addr.isoa_len);
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CADDR]) {
+ printf("make_partial calling: ptr 0x%x, len 0x%x\n", ptr,
+ isop->isop_laddr->siso_addr.isoa_len);
+ }
+#endif
if (cons_use_facils) {
- *ptr++ = 0; /* Marker to separate X.25 facitilies from CCITT ones */
+ *ptr++ = 0; /* Marker to separate X.25 facitilies from
+ * CCITT ones */
*ptr++ = 0x0f;
- *ptr = 0xcb; /* calling facility code */
- ptr ++;
- ptr ++; /* leave room for facil param len (in OCTETS + 1) */
- ptr ++; /* leave room for the facil param len (in nibbles),
- * high two bits of which indicate full/partial NSAP
- */
+ *ptr = 0xcb; /* calling facility code */
+ ptr++;
+ ptr++; /* leave room for facil param len (in OCTETS
+ * + 1) */
+ ptr++; /* leave room for the facil param len (in
+ * nibbles), high two bits of which indicate
+ * full/partial NSAP */
len = isop->isop_laddr->siso_addr.isoa_len;
- bcopy( isop->isop_laddr->siso_data, ptr, len);
- *(ptr-2) = len+1; /* facil param len in octets */
- *(ptr-1) = len<<1; /* facil param len in nibbles */
+ bcopy(isop->isop_laddr->siso_data, ptr, len);
+ *(ptr - 2) = len + 1; /* facil param len in octets */
+ *(ptr - 1) = len << 1; /* facil param len in nibbles */
ptr += len;
- IFDEBUG(D_CADDR)
- printf("make_partial called: ptr 0x%x, len 0x%x\n", ptr,
- isop->isop_faddr->siso_addr.isoa_len);
- ENDDEBUG
- *ptr = 0xc9; /* called facility code */
- ptr ++;
- ptr ++; /* leave room for facil param len (in OCTETS + 1) */
- ptr ++; /* leave room for the facil param len (in nibbles),
- * high two bits of which indicate full/partial NSAP
- */
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CADDR]) {
+ printf("make_partial called: ptr 0x%x, len 0x%x\n", ptr,
+ isop->isop_faddr->siso_addr.isoa_len);
+ }
+#endif
+ *ptr = 0xc9; /* called facility code */
+ ptr++;
+ ptr++; /* leave room for facil param len (in OCTETS
+ * + 1) */
+ ptr++; /* leave room for the facil param len (in
+ * nibbles), high two bits of which indicate
+ * full/partial NSAP */
len = isop->isop_faddr->siso_nlen;
bcopy(isop->isop_faddr->siso_data, ptr, len);
- *(ptr-2) = len+1; /* facil param len = addr len + 1 for each of these
- * two length fields, in octets */
- *(ptr-1) = len<<1; /* facil param len in nibbles */
+ *(ptr - 2) = len + 1; /* facil param len = addr len + 1 for
+ * each of these two length fields,
+ * in octets */
+ *(ptr - 1) = len << 1; /* facil param len in nibbles */
ptr += len;
}
if (*facil_len > MAX_FACILITIES)
return E_CO_PNA_LONG;
- buflen = (int)(ptr - buf);
+ buflen = (int) (ptr - buf);
- IFDEBUG(D_CDUMP_REQ)
- register int i;
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CDUMP_REQ]) {
+ register int i;
- printf("ECN_CONNECT DATA buf 0x%x len %d (0x%x)\n",
- buf, buflen, buflen);
- for( i=0; i < buflen; ) {
+ printf("ECN_CONNECT DATA buf 0x%x len %d (0x%x)\n",
+ buf, buflen, buflen);
+ for (i = 0; i < buflen;) {
printf("+%d: %x %x %x %x %x %x %x %x\n",
- i,
- *(buf+i), *(buf+i+1), *(buf+i+2), *(buf+i+3),
- *(buf+i+4), *(buf+i+5), *(buf+i+6), *(buf+i+7));
- i+=8;
+ i,
+ *(buf + i), *(buf + i + 1), *(buf + i + 2), *(buf + i + 3),
+ *(buf + i + 4), *(buf + i + 5), *(buf + i + 6), *(buf + i + 7));
+ i += 8;
}
- ENDDEBUG
- IFDEBUG(D_CADDR)
- printf("make_partial returns buf 0x%x size 0x%x bytes\n",
- mtod(m, caddr_t), buflen);
- ENDDEBUG
+ }
+#endif
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CADDR]) {
+ printf("make_partial returns buf 0x%x size 0x%x bytes\n",
+ mtod(m, caddr_t), buflen);
+ }
+#endif
if (buflen > MHLEN)
return E_CO_PNA_LONG;
m->m_pkthdr.len = m->m_len = buflen;
lcp->lcd_facilities = m;
- return 0;
+ return 0;
}
/*
* NAME: NSAPtoDTE()
* CALLED FROM:
* make_partial_x25_packet()
- * FUNCTION and ARGUMENTS:
+ * FUNCTION and ARGUMENTS:
* get a DTE address from an NSAP-address (struct sockaddr_iso)
* (dst_octet) is the octet into which to begin stashing the DTE addr
* (dst_nibble) takes 0 or 1. 1 means begin filling in the DTE addr
register struct sockaddr_iso *siso;
register struct sockaddr_x25 *sx25;
{
- int dtelen = -1;
+ int dtelen = -1;
- IFDEBUG(D_CADDR)
- printf("NSAPtoDTE: nsap: %s\n", clnp_iso_addrp(&siso->siso_addr));
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CADDR]) {
+ printf("NSAPtoDTE: nsap: %s\n",
+ clnp_iso_addrp(&siso->siso_addr));
+ }
+#endif
if (siso->siso_data[0] == AFI_37) {
- register char *out = sx25->x25_addr;
- register char *in = siso->siso_data + 1;
- register int nibble;
- char *lim = siso->siso_data + siso->siso_nlen;
- char *olim = out+15;
- int lowNibble = 0;
+ register char *out = sx25->x25_addr;
+ register char *in = siso->siso_data + 1;
+ register int nibble;
+ char *lim = siso->siso_data + siso->siso_nlen;
+ char *olim = out + 15;
+ int lowNibble = 0;
while (in < lim) {
nibble = ((lowNibble ? *in++ : (*in >> 4)) & 0xf) | 0x30;
dtelen = out - sx25->x25_addr;
*out++ = 0;
} else {
- /* error = iso_8208snparesolve(addr, x121string, &x121strlen);*/
+ /*
+ * error = iso_8208snparesolve(addr, x121string,
+ * &x121strlen);
+ */
register struct rtentry *rt;
extern struct sockaddr_iso blank_siso;
struct sockaddr_iso nsiso;
nsiso = blank_siso;
bcopy(nsiso.siso_data, siso->siso_data,
- nsiso.siso_nlen = siso->siso_nlen);
- if (rt = rtalloc1(&nsiso, 1)) {
+ nsiso.siso_nlen = siso->siso_nlen);
+ if ((rt = rtalloc1((struct sockaddr *) &nsiso, 1)) != NULL) {
register struct sockaddr_x25 *sxx =
- (struct sockaddr_x25 *)rt->rt_gateway;
- register char *in = sxx->x25_addr;
+ (struct sockaddr_x25 *) rt->rt_gateway;
+ register char *in = sxx->x25_addr;
rt->rt_use--;
if (sxx && sxx->x25_family == AF_CCITT) {
bcopy(sx25->x25_addr, sxx->x25_addr, sizeof(sx25->x25_addr));
- while (*in++) {}
+ while (*in++) {
+ }
dtelen = in - sxx->x25_addr;
}
}
Static int
FACILtoNSAP(addr, buf)
- register u_char *buf;
+ register u_char *buf;
register struct sockaddr_iso *addr;
{
- int len_in_nibbles = *++buf & 0x3f;
- u_char buf_len = (len_in_nibbles + 1) >> 1;; /* in bytes */
+ int len_in_nibbles = *++buf & 0x3f;
+ u_char buf_len = (len_in_nibbles + 1) >> 1;; /* in bytes */
- IFDEBUG(D_CADDR)
- printf("FACILtoNSAP( 0x%x, 0x%x, 0x%x )\n",
- buf, buf_len, addr );
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CADDR]) {
+ printf("FACILtoNSAP( 0x%x, 0x%x, 0x%x )\n",
+ buf, buf_len, addr);
+ }
+#endif
len_in_nibbles = *buf & 0x3f;
- /* despite the fact that X.25 makes us put a length in nibbles
- * here, the NSAP-addrs are always in full octets
+ /*
+ * despite the fact that X.25 makes us put a length in nibbles here,
+ * the NSAP-addrs are always in full octets
*/
switch (*buf++ & 0xc0) {
case 0:
/* Entire OSI NSAP address */
- bcopy((caddr_t)buf, addr->siso_data, addr->siso_nlen = buf_len);
+ bcopy((caddr_t) buf, addr->siso_data, addr->siso_nlen = buf_len);
break;
case 40:
/* Partial OSI NSAP address, assume trailing */
if (buf_len + addr->siso_nlen > sizeof(addr->siso_addr))
return -1;
- bcopy((caddr_t)buf, TSEL(addr), buf_len);
+ bcopy((caddr_t) buf, TSEL(addr), buf_len);
addr->siso_nlen += buf_len;
break;
default:
- /* Rather than blow away the connection, just ignore and use
- NSAP from DTE */;
+ /*
+ * Rather than blow away the connection, just ignore and use
+ * NSAP from DTE
+ */ ;
}
return 0;
}
-Static
+Static void
init_siso(siso)
-register struct sockaddr_iso *siso;
+ register struct sockaddr_iso *siso;
{
- siso->siso_len = sizeof (*siso);
+ siso->siso_len = sizeof(*siso);
siso->siso_family = AF_ISO;
siso->siso_data[0] = AFI_37;
siso->siso_nlen = 8;
* FUNCTION and ARGUMENTS:
* Creates a type 37 NSAP in the sockaddr_iso (addr)
* from a DTE address found in a sockaddr_x25.
- *
+ *
* RETURNS:
* 0 if ok; E* otherwise.
*/
-Static int
+Static int
DTEtoNSAP(addr, sx)
struct sockaddr_iso *addr;
struct sockaddr_x25 *sx;
{
- register char *in, *out;
- register int first;
- int pad_tail = 0;
- int src_len;
+ register char *in, *out;
+ register int first;
+ int pad_tail = 0;
+ int src_len;
init_siso(addr);
if (src_len & 1) {
*out++ = first;
first = 0;
- }
- else first <<= 4;
+ } else
+ first <<= 4;
}
if (pad_tail)
out[-1] |= 0xf;
- return 0; /* ok */
+ return 0; /* ok */
}
/*
Static int
parse_facil(lcp, isop, buf, buf_len)
- caddr_t buf;
- u_char buf_len; /* in bytes */
- struct isopcb *isop;
- struct pklcd *lcp;
+ caddr_t buf;
+ u_char buf_len;/* in bytes */
+ struct isopcb *isop;
+ struct pklcd *lcp;
{
- register int i;
- register u_char *ptr = (u_char *)buf;
- u_char *ptr_lim, *facil_lim;
- int facil_param_len, facil_len;
-
- IFDEBUG(D_CADDR)
- printf("parse_facil(0x%x, 0x%x, 0x%x, 0x%x)\n",
- lcp, isop, buf, buf_len);
+ register int i;
+ register u_char *ptr = (u_char *) buf;
+ u_char *facil_lim;
+ int facil_param_len = 0, facil_len;
+
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CADDR]) {
+ printf("parse_facil(0x%x, 0x%x, 0x%x, 0x%x)\n",
+ lcp, isop, buf, buf_len);
dump_buf(buf, buf_len);
- ENDDEBUG
+ }
+#endif
- /* find the beginnings of the facility fields in buf
- * by skipping over the called & calling DTE addresses
- * i <- # nibbles in called + # nibbles in calling
- * i += 1 so that an odd nibble gets rounded up to even
- * before dividing by 2, then divide by two to get # octets
+ /*
+ * find the beginnings of the facility fields in buf by skipping over
+ * the called & calling DTE addresses i <- # nibbles in called + #
+ * nibbles in calling i += 1 so that an odd nibble gets rounded up to
+ * even before dividing by 2, then divide by two to get # octets
*/
- i = (int)(*ptr >> 4) + (int)(*ptr&0xf);
+ i = (int) (*ptr >> 4) + (int) (*ptr & 0xf);
i++;
ptr += i >> 1;
- ptr ++; /* plus one for the DTE lengths byte */
+ ptr++; /* plus one for the DTE lengths byte */
/* ptr now is at facil_length field */
facil_len = *ptr++;
facil_lim = ptr + facil_len;
- IFDEBUG(D_CADDR)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CADDR]) {
printf("parse_facils: facil length is 0x%x\n", (int) facil_len);
- ENDDEBUG
+ }
+#endif
while (ptr < facil_lim) {
/* get NSAP addresses from facilities */
switch (*ptr++) {
- case 0xcb:
- /* calling NSAP */
- facil_param_len = FACILtoNSAP(isop->isop_faddr, ptr);
- break;
- case 0xc9:
- /* called NSAP */
- facil_param_len = FACILtoNSAP(isop->isop_laddr, ptr);
- break;
+ case 0xcb:
+ /* calling NSAP */
+ facil_param_len = FACILtoNSAP(isop->isop_faddr, ptr);
+ break;
+ case 0xc9:
+ /* called NSAP */
+ facil_param_len = FACILtoNSAP(isop->isop_laddr, ptr);
+ break;
- /* from here to default are legit cases that I ignore */
- /* variable length */
- case 0xca: /* end-to-end transit delay negot */
- case 0xc6: /* network user id */
- case 0xc5: /* charging info : indicating monetary unit */
- case 0xc2: /* charging info : indicating segment count */
- case 0xc1: /* charging info : indicating call duration */
- case 0xc4: /* RPOA extended format */
- case 0xc3: /* call redirection notification */
- facil_param_len = 0;
- break;
+ /* from here to default are legit cases that I ignore */
+ /* variable length */
+ case 0xca: /* end-to-end transit delay negot */
+ case 0xc6: /* network user id */
+ case 0xc5: /* charging info : indicating monetary unit */
+ case 0xc2: /* charging info : indicating segment count */
+ case 0xc1: /* charging info : indicating call duration */
+ case 0xc4: /* RPOA extended format */
+ case 0xc3: /* call redirection notification */
+ facil_param_len = 0;
+ break;
+
+ /* 1 octet */
+ case 0x0a: /* min. throughput class negot */
+ case 0x02: /* throughput class */
+ case 0x03:
+ case 0x47: /* CUG shit */
+ case 0x0b: /* expedited data negot */
+ case 0x01: /* Fast select or reverse charging (example
+ * of intelligent protocol design) */
+ case 0x04: /* charging info : requesting service */
+ case 0x08: /* called line addr modified notification */
+ case 0x00: /* marker to indicate beginning of CCITT
+ * facils */
+ facil_param_len = 1;
+ break;
- /* 1 octet */
- case 0x0a: /* min. throughput class negot */
- case 0x02: /* throughput class */
- case 0x03: case 0x47: /* CUG shit */
- case 0x0b: /* expedited data negot */
- case 0x01: /* Fast select or reverse charging
- (example of intelligent protocol design) */
- case 0x04: /* charging info : requesting service */
- case 0x08: /* called line addr modified notification */
- case 0x00: /* marker to indicate beginning of CCITT facils */
+ /* any 2 octets */
+ case 0x42: /* pkt size */
+ case 0x43: /* win size */
+ case 0x44: /* RPOA basic format */
+ case 0x41: /* bilateral CUG shit */
+ case 0x49: /* transit delay selection and indication */
+ facil_param_len = 2;
+ break;
+
+ default:
+ printf(
+ "BOGUS FACILITY CODE facil_lim 0x%x facil_len %d, ptr 0x%x *ptr 0x%x\n",
+ facil_lim, facil_len, ptr - 1, ptr[-1]);
+ /*
+ * facil that we don't handle return E_CO_HLI_REJI;
+ */
+ switch (ptr[-1] & 0xc0) {
+ case 0x00:
facil_param_len = 1;
break;
-
- /* any 2 octets */
- case 0x42: /* pkt size */
- case 0x43: /* win size */
- case 0x44: /* RPOA basic format */
- case 0x41: /* bilateral CUG shit */
- case 0x49: /* transit delay selection and indication */
+ case 0x40:
facil_param_len = 2;
break;
-
- default:
- printf(
-"BOGUS FACILITY CODE facil_lim 0x%x facil_len %d, ptr 0x%x *ptr 0x%x\n",
- facil_lim, facil_len, ptr - 1, ptr[-1]);
- /* facil that we don't handle
- return E_CO_HLI_REJI; */
- switch (ptr[-1] & 0xc0) {
- case 0x00: facil_param_len = 1; break;
- case 0x40: facil_param_len = 2; break;
- case 0x80: facil_param_len = 3; break;
- case 0xc0: facil_param_len = 0; break;
- }
+ case 0x80:
+ facil_param_len = 3;
+ break;
+ case 0xc0:
+ facil_param_len = 0;
+ break;
+ }
}
if (facil_param_len == -1)
return E_CO_REG_ICDA;
- if (facil_param_len == 0) /* variable length */
- facil_param_len = (int)*ptr++; /* 1 + the real facil param */
+ if (facil_param_len == 0) /* variable length */
+ facil_param_len = (int) *ptr++; /* 1 + the real facil
+ * param */
ptr += facil_param_len;
}
return 0;
}
-#endif /* TPCONS */
+#endif /* TPCONS */
-/* $NetBSD: if_eon.c,v 1.11 1995/06/13 07:13:28 mycroft Exp $ */
+/* $OpenBSD: if_eon.c,v 1.2 1996/03/04 10:35:24 mickey Exp $ */
+/* $NetBSD: if_eon.c,v 1.12 1996/02/13 22:09:50 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
* ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison
*/
/*
- * EON rfc
+ * EON rfc
* Layer between IP and CLNL
*
* TODO:
#include <netiso/iso_errno.h>
#include <netiso/eonvar.h>
+#include <machine/stdarg.h>
+
extern struct timeval time;
extern struct ifnet loif;
#define EOK 0
-int eoninput();
-int eonoutput();
-int eonioctl();
-int eonattach();
-void eonrtrequest();
-struct ifnet eonif[1];
+struct ifnet eonif[1];
-eonprotoinit() {
+void
+eonprotoinit()
+{
(void) eonattach();
}
* RETURNS: void
*/
+void
eonattach()
{
register struct ifnet *ifp = eonif;
- IFDEBUG(D_EON)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_EON]) {
printf("eonattach()\n");
- ENDDEBUG
+ }
+#endif
ifp->if_unit = 0;
ifp->if_name = "eon";
- ifp->if_mtu = ETHERMTU;
- /* since everything will go out over ether or token ring */
+ ifp->if_mtu = ETHERMTU;
+ /* since everything will go out over ether or token ring */
ifp->if_ioctl = eonioctl;
ifp->if_output = eonoutput;
ifp->if_hdrlen = EONIPLEN;
ifp->if_flags = IFF_BROADCAST;
if_attach(ifp);
- eonioctl(ifp, SIOCSIFADDR, (caddr_t)ifp->if_addrlist.tqh_first);
- eon_llinfo.el_qhdr.link =
+ eonioctl(ifp, SIOCSIFADDR, (caddr_t) ifp->if_addrlist.tqh_first);
+ eon_llinfo.el_qhdr.link =
eon_llinfo.el_qhdr.rlink = &(eon_llinfo.el_qhdr);
- IFDEBUG(D_EON)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_EON]) {
printf("eonattach()\n");
- ENDDEBUG
+ }
+#endif
}
* FUNCTION: eonioctl
*
* PURPOSE: io controls - ifconfig
- * need commands to
+ * need commands to
* link-UP (core addr) (flags: ES, IS)
* link-DOWN (core addr) (flags: ES, IS)
* must be callable from kernel or user
*
* RETURNS: nothing
*/
+int
eonioctl(ifp, cmd, data)
register struct ifnet *ifp;
- u_long cmd;
+ u_long cmd;
register caddr_t data;
{
- int s = splimp();
- register int error = 0;
+ int s = splimp();
+ register int error = 0;
- IFDEBUG(D_EON)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_EON]) {
printf("eonioctl (cmd 0x%lx) \n", cmd);
- ENDDEBUG
+ }
+#endif
switch (cmd) {
register struct ifaddr *ifa;
case SIOCSIFADDR:
- if (ifa = (struct ifaddr *)data) {
+ if ((ifa = (struct ifaddr *) data) != NULL) {
ifp->if_flags |= IFF_UP;
if (ifa->ifa_addr->sa_family != AF_LINK)
ifa->ifa_rtrequest = eonrtrequest;
break;
}
splx(s);
- return(error);
+ return (error);
}
+void
eoniphdr(hdr, loc, ro, class, zero)
-struct route *ro;
-register struct eon_iphdr *hdr;
-caddr_t loc;
+ struct route *ro;
+ register struct eon_iphdr *hdr;
+ caddr_t loc;
+ int class, zero;
{
- struct mbuf mhead;
+ struct mbuf mhead;
register struct sockaddr_in *sin = satosin(&ro->ro_dst);
if (zero) {
- bzero((caddr_t)hdr, sizeof (*hdr));
- bzero((caddr_t)ro, sizeof (*ro));
+ bzero((caddr_t) hdr, sizeof(*hdr));
+ bzero((caddr_t) ro, sizeof(*ro));
}
sin->sin_family = AF_INET;
- sin->sin_len = sizeof (*sin);
- bcopy(loc, (caddr_t)&sin->sin_addr, sizeof(struct in_addr));
+ sin->sin_len = sizeof(*sin);
+ bcopy(loc, (caddr_t) & sin->sin_addr, sizeof(struct in_addr));
/*
* If there is a cached route,
* check that it is to the same destination
if (ro->ro_rt) {
struct sockaddr_in *dst = satosin(rt_key(ro->ro_rt));
if ((ro->ro_rt->rt_flags & RTF_UP) == 0 ||
- sin->sin_addr.s_addr != dst->sin_addr.s_addr) {
+ sin->sin_addr.s_addr != dst->sin_addr.s_addr) {
RTFREE(ro->ro_rt);
- ro->ro_rt = (struct rtentry *)0;
+ ro->ro_rt = (struct rtentry *) 0;
}
}
rtalloc(ro);
ro->ro_rt->rt_use++;
hdr->ei_ip.ip_dst = sin->sin_addr;
hdr->ei_ip.ip_p = IPPROTO_EON;
- hdr->ei_ip.ip_ttl = MAXTTL;
+ hdr->ei_ip.ip_ttl = MAXTTL;
hdr->ei_eh.eonh_class = class;
hdr->ei_eh.eonh_vers = EON_VERSION;
hdr->ei_eh.eonh_csum = 0;
- mhead.m_data = (caddr_t) &hdr->ei_eh;
+ mhead.m_data = (caddr_t) & hdr->ei_eh;
mhead.m_len = sizeof(struct eon_hdr);
mhead.m_next = 0;
- IFDEBUG(D_EON)
- printf("eonoutput : gen csum (0x%x, offset %d, datalen %d)\n",
- &mhead,
- _offsetof(struct eon_hdr, eonh_csum), sizeof(struct eon_hdr));
- ENDDEBUG
- iso_gen_csum(&mhead,
- _offsetof(struct eon_hdr, eonh_csum), sizeof(struct eon_hdr));
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_EON]) {
+ printf("eonoutput : gen csum (0x%x, offset %d, datalen %d)\n",
+ (unsigned int) &mhead,
+ _offsetof(struct eon_hdr, eonh_csum), sizeof(struct eon_hdr));
+ }
+#endif
+ iso_gen_csum(&mhead,
+ _offsetof(struct eon_hdr, eonh_csum), sizeof(struct eon_hdr));
}
/*
* FUNCTION: eonrtrequest
*/
void
eonrtrequest(cmd, rt, gate)
-register struct rtentry *rt;
-register struct sockaddr *gate;
+ int cmd;
+ register struct rtentry *rt;
+ register struct sockaddr *gate;
{
- unsigned long zerodst = 0;
- caddr_t ipaddrloc = (caddr_t) &zerodst;
- register struct eon_llinfo *el = (struct eon_llinfo *)rt->rt_llinfo;
+ unsigned long zerodst = 0;
+ caddr_t ipaddrloc = (caddr_t) & zerodst;
+ register struct eon_llinfo *el = (struct eon_llinfo *) rt->rt_llinfo;
/*
* Common Housekeeping
case RTM_ADD:
case RTM_RESOLVE:
- rt->rt_rmx.rmx_mtu = loif.if_mtu; /* unless better below */
+ rt->rt_rmx.rmx_mtu = loif.if_mtu; /* unless better below */
R_Malloc(el, struct eon_llinfo *, sizeof(*el));
- rt->rt_llinfo = (caddr_t)el;
+ rt->rt_llinfo = (caddr_t) el;
if (el == 0)
return;
Bzero(el, sizeof(*el));
el->el_rt = rt;
break;
}
- if (gate || (gate = rt->rt_gateway)) switch (gate->sa_family) {
+ if (gate || (gate = rt->rt_gateway))
+ switch (gate->sa_family) {
case AF_LINK:
#define SDL(x) ((struct sockaddr_dl *)x)
if (SDL(gate)->sdl_alen == 1)
- el->el_snpaoffset = *(u_char *)LLADDR(SDL(gate));
+ el->el_snpaoffset = *(u_char *) LLADDR(SDL(gate));
else
ipaddrloc = LLADDR(SDL(gate));
break;
case AF_INET:
- ipaddrloc = (caddr_t) &satosin(gate)->sin_addr;
+ ipaddrloc = (caddr_t) & satosin(gate)->sin_addr;
break;
default:
return;
- }
+ }
el->el_flags |= RTF_UP;
eoniphdr(&el->el_ei, ipaddrloc, &el->el_iproute, EON_NORMAL_ADDR, 0);
if (el->el_iproute.ro_rt)
rt->rt_rmx.rmx_mtu = el->el_iproute.ro_rt->rt_rmx.rmx_mtu
- - sizeof(el->el_ei);
+ - sizeof(el->el_ei);
}
/*
* FUNCTION: eonoutput
*
- * PURPOSE: prepend an eon header and hand to IP
- * ARGUMENTS: (ifp) is points to the ifnet structure for this unit/device
- * (m) is an mbuf *, *m is a CLNL packet
- * (dst) is a destination address - have to interp. as
- * multicast or broadcast or real address.
+ * PURPOSE: prepend an eon header and hand to IP
+ * ARGUMENTS: (ifp) is points to the ifnet structure for this
+ * unit/device (m) is an mbuf *, *m is a CLNL packet
+ * (dst) is a destination address - have to interp. as
+ * multicast or broadcast or real address.
*
- * RETURNS: unix error code
+ * RETURNS: unix error code
*
- * NOTES:
+ * NOTES:
*
*/
-eonoutput(ifp, m, dst, rt)
- struct ifnet *ifp;
- register struct mbuf *m; /* packet */
- struct sockaddr_iso *dst; /* destination addr */
+int
+eonoutput(ifp, m, sdst, rt)
+ struct ifnet *ifp;
+ register struct mbuf *m; /* packet */
+ struct sockaddr *sdst; /* destination addr */
struct rtentry *rt;
{
+ struct sockaddr_iso *dst = (struct sockaddr_iso *) sdst;
register struct eon_llinfo *el;
register struct eon_iphdr *ei;
- struct route *ro;
- int datalen;
- struct mbuf *mh;
- int error = 0, class = 0, alen = 0;
- caddr_t ipaddrloc;
+ struct route *ro;
+ int datalen;
+ struct mbuf *mh;
+ int error = 0, class = 0, alen = 0;
+ caddr_t ipaddrloc = NULL;
static struct eon_iphdr eon_iphdr;
static struct route route;
- IFDEBUG(D_EON)
- printf("eonoutput \n" );
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_EON]) {
+ printf("eonoutput \n");
+ }
+#endif
ifp->if_lastchange = time;
ifp->if_opackets++;
- if (rt == 0 || (el = (struct eon_llinfo *)rt->rt_llinfo) == 0) {
+ if (rt == 0 || (el = (struct eon_llinfo *) rt->rt_llinfo) == 0) {
if (dst->siso_family == AF_LINK) {
- register struct sockaddr_dl *sdl = (struct sockaddr_dl *)dst;
+ register struct sockaddr_dl *sdl = (struct sockaddr_dl *) dst;
ipaddrloc = LLADDR(sdl);
alen = sdl->sdl_alen;
- } else if (dst->siso_family == AF_ISO && dst->siso_data[0] == AFI_SNA) {
+ } else if (dst->siso_family == AF_ISO &&
+ dst->siso_data[0] == AFI_SNA) {
alen = dst->siso_nlen - 1;
ipaddrloc = (caddr_t) dst->siso_data + 1;
}
switch (alen) {
case 5:
- class = 4[(u_char *)ipaddrloc];
+ class = 4[(u_char *) ipaddrloc];
case 4:
ro = &route;
ei = &eon_iphdr;
goto send;
}
einval:
- error = EINVAL;
+ error = EINVAL;
goto flush;
}
if ((el->el_flags & RTF_UP) == 0) {
- eonrtrequest(RTM_CHANGE, rt, (struct sockaddr *)0);
+ eonrtrequest(RTM_CHANGE, rt, (struct sockaddr *) 0);
if ((el->el_flags & RTF_UP) == 0) {
error = EHOSTUNREACH;
goto flush;
ro = &el->el_iproute;
if (el->el_snpaoffset) {
if (dst->siso_family == AF_ISO) {
- bcopy((caddr_t) &dst->siso_data[el->el_snpaoffset],
- (caddr_t) &ei->ei_ip.ip_dst, sizeof(ei->ei_ip.ip_dst));
+ bcopy((caddr_t) & dst->siso_data[el->el_snpaoffset],
+ (caddr_t) & ei->ei_ip.ip_dst, sizeof(ei->ei_ip.ip_dst));
} else
goto einval;
}
/* put an eon_hdr in the buffer, prepended by an ip header */
datalen = m->m_pkthdr.len + EONIPLEN;
MGETHDR(mh, M_DONTWAIT, MT_HEADER);
- if(mh == (struct mbuf *)0)
+ if (mh == (struct mbuf *) 0)
goto flush;
mh->m_next = m;
m = mh;
MH_ALIGN(m, sizeof(struct eon_iphdr));
m->m_len = sizeof(struct eon_iphdr);
ifp->if_obytes +=
- (ei->ei_ip.ip_len = (u_short)(m->m_pkthdr.len = datalen));
+ (ei->ei_ip.ip_len = (u_short) (m->m_pkthdr.len = datalen));
*mtod(m, struct eon_iphdr *) = *ei;
- IFDEBUG(D_EON)
- printf("eonoutput dst ip addr : %x\n", ei->ei_ip.ip_dst.s_addr);
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_EON]) {
+ printf("eonoutput dst ip addr : %x\n", ei->ei_ip.ip_dst.s_addr);
printf("eonoutput ip_output : eonip header:\n");
dump_buf(ei, sizeof(struct eon_iphdr));
- ENDDEBUG
+ }
+#endif
- error = ip_output(m, (struct mbuf *)0, ro, 0, NULL);
+ error = ip_output(m, (struct mbuf *) 0, ro, 0, NULL);
m = 0;
if (error) {
ifp->if_oerrors++;
return error;
}
-eoninput(m, iphlen)
- register struct mbuf *m;
- int iphlen;
+void
+#if __STDC__
+eoninput(struct mbuf *m, ...)
+#else
+eoninput(m, va_alist)
+ struct mbuf *m;
+ va_dcl
+#endif
{
- register struct eon_hdr *eonhdr;
- register struct ip *iphdr;
- struct ifnet *eonifp;
- int s;
-
- eonifp = &eonif[0]; /* kludge - really want to give CLNP
- * the ifp for eon, not for the real device
- */
-
- IFDEBUG(D_EON)
+ int iphlen;
+ register struct eon_hdr *eonhdr;
+ register struct ip *iphdr;
+ struct ifnet *eonifp;
+ int s;
+ va_list ap;
+
+ va_start(ap, m);
+ iphlen = va_arg(ap, int);
+ va_end(ap);
+
+ eonifp = &eonif[0]; /* kludge - really want to give CLNP the ifp
+ * for eon, not for the real device */
+
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_EON]) {
printf("eoninput() 0x%x m_data 0x%x m_len 0x%x dequeued\n",
- m, m?m->m_data:0, m?m->m_len:0);
- ENDDEBUG
+ (unsigned int) m,
+ (unsigned int) (m ? m->m_data : 0), m ? m->m_len : 0);
+ }
+#endif
if (m == 0)
return;
- if (iphlen > sizeof (struct ip))
- ip_stripoptions(m, (struct mbuf *)0);
+ if (iphlen > sizeof(struct ip))
+ ip_stripoptions(m, (struct mbuf *) 0);
if (m->m_len < EONIPLEN) {
if ((m = m_pullup(m, EONIPLEN)) == 0) {
IncStat(es_badhdr);
-drop:
- IFDEBUG(D_EON)
- printf("eoninput: DROP \n" );
- ENDDEBUG
- eonifp->if_ierrors ++;
+ drop:
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_EON]) {
+ printf("eoninput: DROP \n");
+ }
+#endif
+ eonifp->if_ierrors++;
m_freem(m);
return;
}
eonif->if_lastchange = time;
iphdr = mtod(m, struct ip *);
/* do a few checks for debugging */
- if( iphdr->ip_p != IPPROTO_EON ) {
+ if (iphdr->ip_p != IPPROTO_EON) {
IncStat(es_badhdr);
goto drop;
}
/* temporarily drop ip header from the mbuf */
m->m_data += sizeof(struct ip);
eonhdr = mtod(m, struct eon_hdr *);
- if( iso_check_csum( m, sizeof(struct eon_hdr) ) != EOK ) {
+ if (iso_check_csum(m, sizeof(struct eon_hdr)) != EOK) {
IncStat(es_badcsum);
goto drop;
}
m->m_data -= sizeof(struct ip);
-
- IFDEBUG(D_EON)
- printf("eoninput csum ok class 0x%x\n", eonhdr->eonh_class );
+
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_EON]) {
+ printf("eoninput csum ok class 0x%x\n", eonhdr->eonh_class);
printf("eoninput: eon header:\n");
dump_buf(eonhdr, sizeof(struct eon_hdr));
- ENDDEBUG
+ }
+#endif
/* checks for debugging */
- if( eonhdr->eonh_vers != EON_VERSION) {
+ if (eonhdr->eonh_vers != EON_VERSION) {
IncStat(es_badhdr);
goto drop;
}
- m->m_flags &= ~(M_BCAST|M_MCAST);
- switch( eonhdr->eonh_class) {
- case EON_BROADCAST:
- IncStat(es_in_broad);
- m->m_flags |= M_BCAST;
- break;
- case EON_NORMAL_ADDR:
- IncStat(es_in_normal);
- break;
- case EON_MULTICAST_ES:
- IncStat(es_in_multi_es);
- m->m_flags |= M_MCAST;
- break;
- case EON_MULTICAST_IS:
- IncStat(es_in_multi_is);
- m->m_flags |= M_MCAST;
- break;
+ m->m_flags &= ~(M_BCAST | M_MCAST);
+ switch (eonhdr->eonh_class) {
+ case EON_BROADCAST:
+ IncStat(es_in_broad);
+ m->m_flags |= M_BCAST;
+ break;
+ case EON_NORMAL_ADDR:
+ IncStat(es_in_normal);
+ break;
+ case EON_MULTICAST_ES:
+ IncStat(es_in_multi_es);
+ m->m_flags |= M_MCAST;
+ break;
+ case EON_MULTICAST_IS:
+ IncStat(es_in_multi_is);
+ m->m_flags |= M_MCAST;
+ break;
}
eonifp->if_ipackets++;
{
/* put it on the CLNP queue and set soft interrupt */
- struct ifqueue *ifq;
- extern struct ifqueue clnlintrq;
+ struct ifqueue *ifq;
+ extern struct ifqueue clnlintrq;
- m->m_pkthdr.rcvif = eonifp; /* KLUDGE */
- IFDEBUG(D_EON)
+ m->m_pkthdr.rcvif = eonifp; /* KLUDGE */
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_EON]) {
printf("eoninput to clnl IFQ\n");
- ENDDEBUG
+ }
+#endif
ifq = &clnlintrq;
s = splimp();
if (IF_QFULL(ifq)) {
return;
}
IF_ENQUEUE(ifq, m);
- IFDEBUG(D_EON)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_EON]) {
printf(
- "0x%x enqueued on clnp Q: m_len 0x%x m_type 0x%x m_data 0x%x\n",
- m, m->m_len, m->m_type, m->m_data);
+ "0x%x enqueued on clnp Q: m_len 0x%x m_type 0x%x m_data 0x%x\n",
+ (unsigned int) m, m->m_len, m->m_type,
+ (unsigned int) m->m_data);
dump_buf(mtod(m, caddr_t), m->m_len);
- ENDDEBUG
+ }
+#endif
schednetisr(NETISR_ISO);
splx(s);
}
}
-int
-eonctlinput(cmd, sin)
- int cmd;
- struct sockaddr_in *sin;
+void *
+eonctlinput(cmd, sa, dummy)
+ int cmd;
+ struct sockaddr *sa;
+ void *dummy;
{
- extern u_char inetctlerrmap[];
-
- IFDEBUG(D_EON)
+ struct sockaddr_in *sin = (struct sockaddr_in *) sa;
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_EON]) {
printf("eonctlinput: cmd 0x%x addr: ", cmd);
- dump_isoaddr(sin);
+ dump_isoaddr((struct sockaddr_iso *) sin);
printf("\n");
- ENDDEBUG
+ }
+#endif
if (cmd < 0 || cmd > PRC_NCMDS)
- return 0;
+ return NULL;
IncStat(es_icmp[cmd]);
switch (cmd) {
- case PRC_QUENCH:
- case PRC_QUENCH2:
- /* TODO: set the dec bit */
- break;
- case PRC_TIMXCEED_REASS:
- case PRC_ROUTEDEAD:
- case PRC_HOSTUNREACH:
- case PRC_UNREACH_NET:
- case PRC_IFDOWN:
- case PRC_UNREACH_HOST:
- case PRC_HOSTDEAD:
- case PRC_TIMXCEED_INTRANS:
- /* TODO: mark the link down */
- break;
+ case PRC_QUENCH:
+ case PRC_QUENCH2:
+ /* TODO: set the dec bit */
+ break;
+ case PRC_TIMXCEED_REASS:
+ case PRC_ROUTEDEAD:
+ case PRC_HOSTUNREACH:
+ case PRC_UNREACH_NET:
+ case PRC_IFDOWN:
+ case PRC_UNREACH_HOST:
+ case PRC_HOSTDEAD:
+ case PRC_TIMXCEED_INTRANS:
+ /* TODO: mark the link down */
+ break;
- case PRC_UNREACH_PROTOCOL:
- case PRC_UNREACH_PORT:
- case PRC_UNREACH_SRCFAIL:
- case PRC_REDIRECT_NET:
- case PRC_REDIRECT_HOST:
- case PRC_REDIRECT_TOSNET:
- case PRC_REDIRECT_TOSHOST:
- case PRC_MSGSIZE:
- case PRC_PARAMPROB:
- /* printf("eonctlinput: ICMP cmd 0x%x\n", cmd );*/
+ case PRC_UNREACH_PROTOCOL:
+ case PRC_UNREACH_PORT:
+ case PRC_UNREACH_SRCFAIL:
+ case PRC_REDIRECT_NET:
+ case PRC_REDIRECT_HOST:
+ case PRC_REDIRECT_TOSNET:
+ case PRC_REDIRECT_TOSHOST:
+ case PRC_MSGSIZE:
+ case PRC_PARAMPROB:
+ /* printf("eonctlinput: ICMP cmd 0x%x\n", cmd ); */
break;
}
- return 0;
+ return NULL;
}
#endif
-/* $NetBSD: iso.c,v 1.12 1995/06/13 07:13:29 mycroft Exp $ */
+/* $OpenBSD: iso.c,v 1.2 1996/03/04 10:35:26 mickey Exp $ */
+/* $NetBSD: iso.c,v 1.13 1996/02/13 22:09:54 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
#ifdef ISO
-int iso_interfaces = 0; /* number of external interfaces */
-int ether_output();
-void llc_rtrequest();
+int iso_interfaces = 0; /* number of external interfaces */
/*
* FUNCTION: iso_addrmatch1
*
- * PURPOSE: decide if the two iso_addrs passed are equal
+ * PURPOSE: decide if the two iso_addrs passed are equal
*
- * RETURNS: true if the addrs match, false if they do not
+ * RETURNS: true if the addrs match, false if they do not
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
*/
+int
iso_addrmatch1(isoaa, isoab)
-register struct iso_addr *isoaa, *isoab; /* addresses to check */
+ register struct iso_addr *isoaa, *isoab; /* addresses to check */
{
- u_int compare_len;
+ u_int compare_len;
- IFDEBUG(D_ROUTE)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ROUTE]) {
printf("iso_addrmatch1: comparing lengths: %d to %d\n", isoaa->isoa_len,
- isoab->isoa_len);
+ isoab->isoa_len);
printf("a:\n");
dump_buf(isoaa->isoa_genaddr, isoaa->isoa_len);
printf("b:\n");
dump_buf(isoab->isoa_genaddr, isoab->isoa_len);
- ENDDEBUG
+ }
+#endif
if ((compare_len = isoaa->isoa_len) != isoab->isoa_len) {
- IFDEBUG(D_ROUTE)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ROUTE]) {
printf("iso_addrmatch1: returning false because of lengths\n");
- ENDDEBUG
+ }
+#endif
return 0;
}
-
#ifdef notdef
/* TODO : generalize this to all afis with masks */
- if( isoaa->isoa_afi == AFI_37 ) {
- /* must not compare 2 least significant digits, or for
- * that matter, the DSP
+ if (isoaa->isoa_afi == AFI_37) {
+ /*
+ * must not compare 2 least significant digits, or for that
+ * matter, the DSP
*/
- compare_len = ADDR37_IDI_LEN - 1;
+ compare_len = ADDR37_IDI_LEN - 1;
}
#endif
- IFDEBUG(D_ROUTE)
- int i;
- char *a, *b;
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ROUTE]) {
+ int i;
+ char *a, *b;
a = isoaa->isoa_genaddr;
b = isoab->isoa_genaddr;
- for (i=0; i<compare_len; i++) {
- printf("<%x=%x>", a[i]&0xff, b[i]&0xff);
+ for (i = 0; i < compare_len; i++) {
+ printf("<%x=%x>", a[i] & 0xff, b[i] & 0xff);
if (a[i] != b[i]) {
printf("\naddrs are not equal at byte %d\n", i);
- return(0);
+ return (0);
}
}
printf("\n");
printf("addrs are equal\n");
return (1);
- ENDDEBUG
+ }
+#endif
return (!bcmp(isoaa->isoa_genaddr, isoab->isoa_genaddr, compare_len));
}
/*
* FUNCTION: iso_addrmatch
*
- * PURPOSE: decide if the two sockadrr_isos passed are equal
+ * PURPOSE: decide if the two sockadrr_isos passed are equal
*
- * RETURNS: true if the addrs match, false if they do not
+ * RETURNS: true if the addrs match, false if they do not
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
*/
+int
iso_addrmatch(sisoa, sisob)
-struct sockaddr_iso *sisoa, *sisob; /* addresses to check */
+ struct sockaddr_iso *sisoa, *sisob; /* addresses to check */
{
- return(iso_addrmatch1(&sisoa->siso_addr, &sisob->siso_addr));
+ return (iso_addrmatch1(&sisoa->siso_addr, &sisob->siso_addr));
}
#ifdef notdef
/*
* FUNCTION: iso_netmatch
*
- * PURPOSE: similar to iso_addrmatch but takes sockaddr_iso
- * as argument.
+ * PURPOSE: similar to iso_addrmatch but takes sockaddr_iso
+ * as argument.
*
- * RETURNS: true if same net, false if not
+ * RETURNS: true if same net, false if not
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
*/
+int
iso_netmatch(sisoa, sisob)
-struct sockaddr_iso *sisoa, *sisob;
+ struct sockaddr_iso *sisoa, *sisob;
{
- u_char bufa[sizeof(struct sockaddr_iso)];
- u_char bufb[sizeof(struct sockaddr_iso)];
- register int lena, lenb;
+ u_char bufa[sizeof(struct sockaddr_iso)];
+ u_char bufb[sizeof(struct sockaddr_iso)];
+ register int lena, lenb;
lena = iso_netof(&sisoa->siso_addr, bufa);
lenb = iso_netof(&sisob->siso_addr, bufb);
- IFDEBUG(D_ROUTE)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ROUTE]) {
printf("iso_netmatch: comparing lengths: %d to %d\n", lena, lenb);
printf("a:\n");
dump_buf(bufa, lena);
printf("b:\n");
dump_buf(bufb, lenb);
- ENDDEBUG
+ }
+#endif
return ((lena == lenb) && (!bcmp(bufa, bufb, lena)));
}
/*
* FUNCTION: iso_hashchar
*
- * PURPOSE: Hash all character in the buffer specified into
- * a long. Return the long.
+ * PURPOSE: Hash all character in the buffer specified into
+ * a long. Return the long.
*
- * RETURNS: The hash value.
+ * RETURNS: The hash value.
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES: The hash is achieved by exclusive ORing 4 byte
- * quantities.
+ * NOTES: The hash is achieved by exclusive ORing 4 byte
+ * quantities.
*/
u_long
iso_hashchar(buf, len)
-register caddr_t buf; /* buffer to pack from */
-register int len; /* length of buffer */
+ register caddr_t buf; /* buffer to pack from */
+ register int len; /* length of buffer */
{
- register u_long h = 0;
- register int i;
+ register u_long h = 0;
+ register int i;
- for (i=0; i<len; i+=4) {
- register u_long l = 0;
+ for (i = 0; i < len; i += 4) {
+ register u_long l = 0;
if ((len - i) < 4) {
/* buffer not multiple of 4 */
switch (len - i) {
- case 3:
- l |= buf[i+2] << 8;
- case 2:
- l |= buf[i+1] << 16;
- case 1:
- l |= buf[i] << 24;
- break;
- default:
- printf("iso_hashchar: unexpected value x%x\n", len - i);
- break;
+ case 3:
+ l |= buf[i + 2] << 8;
+ case 2:
+ l |= buf[i + 1] << 16;
+ case 1:
+ l |= buf[i] << 24;
+ break;
+ default:
+ printf("iso_hashchar: unexpected value x%x\n", len - i);
+ break;
}
} else {
l |= buf[i] << 24;
- l |= buf[i+1] << 16;
- l |= buf[i+2] << 8;
- l |= buf[i+3];
+ l |= buf[i + 1] << 16;
+ l |= buf[i + 2] << 8;
+ l |= buf[i + 3];
}
h ^= l;
}
-
+
h ^= (u_long) (len % 4);
- return(h);
+ return (h);
}
+
#ifdef notdef
/*
* FUNCTION: iso_hash
*
- * PURPOSE: Fill in fields of afhash structure based upon addr passed.
+ * PURPOSE: Fill in fields of afhash structure based upon addr
+ * passed.
*
- * RETURNS: none
+ * RETURNS: none
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
*/
+void
iso_hash(siso, hp)
-struct sockaddr_iso *siso; /* address to perform hash on */
-struct afhash *hp; /* RETURN: hash info here */
+ struct sockaddr_iso *siso; /* address to perform hash on */
+ struct afhash *hp; /* RETURN: hash info here */
{
- u_long buf[sizeof(struct sockaddr_iso)+1/4];
- register int bufsize;
+ u_long buf[sizeof(struct sockaddr_iso) + 1 / 4];
+ register int bufsize;
bzero(buf, sizeof(buf));
bufsize = iso_netof(&siso->siso_addr, buf);
- hp->afh_nethash = iso_hashchar((caddr_t)buf, bufsize);
+ hp->afh_nethash = iso_hashchar((caddr_t) buf, bufsize);
- IFDEBUG(D_ROUTE)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ROUTE]) {
printf("iso_hash: iso_netof: bufsize = %d\n", bufsize);
- ENDDEBUG
+ }
+#endif
- hp->afh_hosthash = iso_hashchar((caddr_t)&siso->siso_addr,
- siso->siso_addr.isoa_len);
+ hp->afh_hosthash = iso_hashchar((caddr_t) & siso->siso_addr,
+ siso->siso_addr.isoa_len);
- IFDEBUG(D_ROUTE)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ROUTE]) {
printf("iso_hash: %s: nethash = x%x, hosthash = x%x\n",
- clnp_iso_addrp(&siso->siso_addr), hp->afh_nethash,
- hp->afh_hosthash);
- ENDDEBUG
+ clnp_iso_addrp(&siso->siso_addr), hp->afh_nethash,
+ hp->afh_hosthash);
+ }
+#endif
}
/*
* FUNCTION: iso_netof
*
- * PURPOSE: Extract the network portion of the iso address.
- * The network portion of the iso address varies depending
- * on the type of address. The network portion of the
- * address will include the IDP. The network portion is:
- *
- * TYPE DESC
- * t37 The AFI and x.121 (IDI)
- * osinet The AFI, orgid, snetid
- * rfc986 The AFI, vers and network part of
- * internet address.
+ * PURPOSE: Extract the network portion of the iso address.
+ * The network portion of the iso address varies depending
+ * on the type of address. The network portion of the
+ * address will include the IDP. The network portion is:
+ *
+ * TYPE DESC
+ * t37 The AFI and x.121 (IDI)
+ * osinet The AFI, orgid, snetid
+ * rfc986 The AFI, vers and network part
+ * of internet address.
*
- * RETURNS: number of bytes placed into buf.
+ * RETURNS: number of bytes placed into buf.
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES: Buf is assumed to be big enough
+ * NOTES: Buf is assumed to be big enough
*/
+u_int
iso_netof(isoa, buf)
-struct iso_addr *isoa; /* address */
-caddr_t buf; /* RESULT: network portion of address here */
+ struct iso_addr *isoa; /* address */
+ caddr_t buf; /* RESULT: network portion of address here */
{
- u_int len = 1; /* length of afi */
+ u_int len = 1;/* length of afi */
switch (isoa->isoa_afi) {
- case AFI_37:
- /*
- * Due to classic x.25 tunnel vision, there is no
- * net portion of an x.121 address. For our purposes
- * the AFI will do, so that all x.25 -type addresses
- * map to the single x.25 SNPA. (Cannot have more than
- * one, obviously).
- */
+ case AFI_37:
+ /*
+ * Due to classic x.25 tunnel vision, there is no
+ * net portion of an x.121 address. For our purposes
+ * the AFI will do, so that all x.25 -type addresses
+ * map to the single x.25 SNPA. (Cannot have more than
+ * one, obviously).
+ */
- break;
+ break;
-/* case AFI_OSINET:*/
- case AFI_RFC986: {
- u_short idi; /* value of idi */
+ /* case AFI_OSINET: */
+ case AFI_RFC986:{
+ u_short idi; /* value of idi */
/* osinet and rfc986 have idi in the same place */
CTOH(isoa->rfc986_idi[0], isoa->rfc986_idi[1], idi);
if (idi == IDI_OSINET)
-/*
- * Network portion of OSINET address can only be the IDI. Clearly,
- * with one x25 interface, one could get to several orgids, and
- * several snetids.
- len += (ADDROSINET_IDI_LEN + OVLOSINET_ORGID_LEN +
- OVLOSINET_SNETID_LEN);
- */
+ /*
+ * Network portion of OSINET address can only
+ * be the IDI. Clearly, with one x25 interface,
+ * one could get to several orgids, and
+ * several snetids.
+ */
+#if 0
+ len += (ADDROSINET_IDI_LEN +
+ OVLOSINET_ORGID_LEN +
+ OVLOSINET_SNETID_LEN);
+#endif
len += ADDROSINET_IDI_LEN;
else if (idi == IDI_RFC986) {
- struct ovl_rfc986 *o986 = (struct ovl_rfc986 *)isoa;
+ struct ovl_rfc986 *o986 =
+ (struct ovl_rfc986 *) isoa;
- /* bump len to include idi and version (1 byte) */
+ /*
+ * bump len to include idi and version (1
+ * byte)
+ */
len += ADDRRFC986_IDI_LEN + 1;
- IFDEBUG(D_ROUTE)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ROUTE]) {
printf("iso_netof: isoa ");
dump_buf(isoa, sizeof(*isoa));
- printf("iso_netof: inetaddr 0x%x ", inetaddr);
- ENDDEBUG
+ printf("iso_netof: inetaddr 0x%x ",
+ inetaddr);
+ }
+#endif
- /* bump len by size of network portion of inet address */
+ /*
+ * bump len by size of network portion of
+ * inet address
+ */
if (IN_CLASSA(o986->o986_inetaddr)) {
- len += 4-IN_CLASSA_NSHIFT/8;
- IFDEBUG(D_ROUTE)
+ len += 4 - IN_CLASSA_NSHIFT / 8;
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ROUTE]) {
printf("iso_netof: class A net len is now %d\n", len);
- ENDDEBUG
+ }
+#endif
} else if (IN_CLASSB(o986->o986_inetaddr)) {
- len += 4-IN_CLASSB_NSHIFT/8;
- IFDEBUG(D_ROUTE)
+ len += 4 - IN_CLASSB_NSHIFT / 8;
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ROUTE]) {
printf("iso_netof: class B net len is now %d\n", len);
- ENDDEBUG
+ }
+#endif
} else {
- len += 4-IN_CLASSC_NSHIFT/8;
- IFDEBUG(D_ROUTE)
+ len += 4 - IN_CLASSC_NSHIFT / 8;
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ROUTE]) {
printf("iso_netof: class C net len is now %d\n", len);
- ENDDEBUG
+ }
+#endif
}
} else
len = 0;
} break;
- default:
- len = 0;
+ default:
+ len = 0;
}
- bcopy((caddr_t)isoa, buf, len);
- IFDEBUG(D_ROUTE)
+ bcopy((caddr_t) isoa, buf, len);
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ROUTE]) {
printf("iso_netof: isoa ");
dump_buf(isoa, len);
printf("iso_netof: net ");
dump_buf(buf, len);
- ENDDEBUG
+ }
+#endif
return len;
}
-#endif /* notdef */
+#endif /* notdef */
/*
* Generic iso control operations (ioctl's).
* Ifp is 0 if not an interface-specific ioctl.
*/
/* ARGSUSED */
+int
iso_control(so, cmd, data, ifp)
- struct socket *so;
- u_long cmd;
- caddr_t data;
+ struct socket *so;
+ u_long cmd;
+ caddr_t data;
register struct ifnet *ifp;
{
- register struct iso_ifreq *ifr = (struct iso_ifreq *)data;
+ register struct iso_ifreq *ifr = (struct iso_ifreq *) data;
register struct iso_ifaddr *ia = 0;
- register struct ifaddr *ifa;
- struct iso_aliasreq *ifra = (struct iso_aliasreq *)data;
- int error, hostIsNew, maskIsNew;
+ struct iso_aliasreq *ifra = (struct iso_aliasreq *) data;
+ int error, hostIsNew, maskIsNew;
/*
* Find address for this interface, if it exists.
case SIOCAIFADDR_ISO:
case SIOCDIFADDR_ISO:
if (ifra->ifra_addr.siso_family == AF_ISO)
- for (; ia; ia = ia->ia_list.tqe_next) {
- if (ia->ia_ifp == ifp &&
- SAME_ISOADDR(&ia->ia_addr, &ifra->ifra_addr))
- break;
- }
+ for (; ia; ia = ia->ia_list.tqe_next) {
+ if (ia->ia_ifp == ifp &&
+ SAME_ISOADDR(&ia->ia_addr, &ifra->ifra_addr))
+ break;
+ }
if ((so->so_state & SS_PRIV) == 0)
return (EPERM);
if (ifp == 0)
tuba_table_init();
#endif
MALLOC(ia, struct iso_ifaddr *, sizeof(*ia),
- M_IFADDR, M_WAITOK);
+ M_IFADDR, M_WAITOK);
if (ia == 0)
return (ENOBUFS);
- bzero((caddr_t)ia, sizeof(*ia));
+ bzero((caddr_t) ia, sizeof(*ia));
TAILQ_INSERT_TAIL(&iso_ifaddr, ia, ia_list);
- TAILQ_INSERT_TAIL(&ifp->if_addrlist, (struct ifaddr *)ia,
- ifa_list);
+ TAILQ_INSERT_TAIL(&ifp->if_addrlist, (struct ifaddr *) ia,
+ ifa_list);
ia->ia_ifa.ifa_addr = sisotosa(&ia->ia_addr);
ia->ia_ifa.ifa_dstaddr = sisotosa(&ia->ia_dstaddr);
ia->ia_ifa.ifa_netmask = sisotosa(&ia->ia_sockmask);
break;
case SIOCAIFADDR_ISO:
- maskIsNew = 0; hostIsNew = 1; error = 0;
+ maskIsNew = 0;
+ hostIsNew = 1;
+ error = 0;
if (ia->ia_addr.siso_family == AF_ISO) {
if (ifra->ifra_addr.siso_len == 0) {
ifra->ifra_addr = ia->ia_addr;
(ifra->ifra_dstaddr.siso_family == AF_ISO)) {
iso_ifscrub(ifp, ia);
ia->ia_dstaddr = ifra->ifra_dstaddr;
- maskIsNew = 1; /* We lie; but the effect's the same */
+ maskIsNew = 1; /* We lie; but the effect's the same */
}
if (ifra->ifra_addr.siso_family == AF_ISO &&
- (hostIsNew || maskIsNew)) {
+ (hostIsNew || maskIsNew)) {
error = iso_ifinit(ifp, ia, &ifra->ifra_addr, 0);
}
if (ifra->ifra_snpaoffset)
case SIOCDIFADDR_ISO:
iso_ifscrub(ifp, ia);
- TAILQ_REMOVE(&ifp->if_addrlist, (struct ifaddr *)ia, ifa_list);
+ TAILQ_REMOVE(&ifp->if_addrlist, (struct ifaddr *) ia, ifa_list);
TAILQ_REMOVE(&iso_ifaddr, ia, ia_list);
IFAFREE((&ia->ia_ifa));
break;
default:
if (ifp == 0 || ifp->if_ioctl == 0)
return (EOPNOTSUPP);
- return ((*ifp->if_ioctl)(ifp, cmd, data));
+ return ((*ifp->if_ioctl) (ifp, cmd, data));
}
return (0);
}
/*
* Delete any existing route for an interface.
*/
+void
iso_ifscrub(ifp, ia)
register struct ifnet *ifp;
register struct iso_ifaddr *ia;
{
- int nsellength = ia->ia_addr.siso_tlen;
+ int nsellength = ia->ia_addr.siso_tlen;
if ((ia->ia_flags & IFA_ROUTE) == 0)
return;
ia->ia_addr.siso_tlen = 0;
if (ifp->if_flags & IFF_LOOPBACK)
- rtinit(&(ia->ia_ifa), (int)RTM_DELETE, RTF_HOST);
+ rtinit(&(ia->ia_ifa), (int) RTM_DELETE, RTF_HOST);
else if (ifp->if_flags & IFF_POINTOPOINT)
- rtinit(&(ia->ia_ifa), (int)RTM_DELETE, RTF_HOST);
+ rtinit(&(ia->ia_ifa), (int) RTM_DELETE, RTF_HOST);
else {
- rtinit(&(ia->ia_ifa), (int)RTM_DELETE, 0);
+ rtinit(&(ia->ia_ifa), (int) RTM_DELETE, 0);
}
ia->ia_addr.siso_tlen = nsellength;
ia->ia_flags &= ~IFA_ROUTE;
* Initialize an interface's internet address
* and routing table entry.
*/
+int
iso_ifinit(ifp, ia, siso, scrub)
register struct ifnet *ifp;
register struct iso_ifaddr *ia;
struct sockaddr_iso *siso;
+ int scrub;
{
struct sockaddr_iso oldaddr;
- int s = splimp(), error, nsellength;
+ int s = splimp(), error, nsellength;
oldaddr = ia->ia_addr;
ia->ia_addr = *siso;
* and to validate the address if necessary.
*/
if (ifp->if_ioctl &&
- (error = (*ifp->if_ioctl)(ifp, SIOCSIFADDR, (caddr_t)ia))) {
+ (error = (*ifp->if_ioctl) (ifp, SIOCSIFADDR, (caddr_t) ia))) {
splx(s);
ia->ia_addr = oldaddr;
return (error);
iso_ifscrub(ifp, ia);
ia->ia_ifa.ifa_addr = sisotosa(&ia->ia_addr);
}
- /* XXX -- The following is here temporarily out of laziness
- in not changing every ethernet driver's if_ioctl routine */
+ /*
+ * XXX -- The following is here temporarily out of laziness in not
+ * changing every ethernet driver's if_ioctl routine
+ */
if (ifp->if_output == ether_output) {
ia->ia_ifa.ifa_rtrequest = llc_rtrequest;
ia->ia_ifa.ifa_flags |= RTF_CLONING;
ia->ia_addr.siso_tlen = 0;
if (ifp->if_flags & IFF_LOOPBACK) {
ia->ia_ifa.ifa_dstaddr = ia->ia_ifa.ifa_addr;
- error = rtinit(&(ia->ia_ifa), (int)RTM_ADD, RTF_HOST|RTF_UP);
+ error = rtinit(&(ia->ia_ifa), (int) RTM_ADD, RTF_HOST | RTF_UP);
} else if (ifp->if_flags & IFF_POINTOPOINT &&
- ia->ia_dstaddr.siso_family == AF_ISO)
- error = rtinit(&(ia->ia_ifa), (int)RTM_ADD, RTF_HOST|RTF_UP);
+ ia->ia_dstaddr.siso_family == AF_ISO)
+ error = rtinit(&(ia->ia_ifa), (int) RTM_ADD, RTF_HOST | RTF_UP);
else {
rt_maskedcopy(ia->ia_ifa.ifa_addr, ia->ia_ifa.ifa_dstaddr,
- ia->ia_ifa.ifa_netmask);
+ ia->ia_ifa.ifa_netmask);
ia->ia_dstaddr.siso_nlen =
min(ia->ia_addr.siso_nlen, (ia->ia_sockmask.siso_len - 6));
- error = rtinit(&(ia->ia_ifa), (int)RTM_ADD, RTF_UP);
+ error = rtinit(&(ia->ia_ifa), (int) RTM_ADD, RTF_UP);
}
ia->ia_addr.siso_tlen = nsellength;
ia->ia_flags |= IFA_ROUTE;
}
#ifdef notdef
-struct ifaddr *
+struct ifaddr *
iso_ifwithidi(addr)
register struct sockaddr *addr;
{
register struct ifnet *ifp;
register struct ifaddr *ifa;
- register u_int af = addr->sa_family;
+ register u_int af = addr->sa_family;
if (af != AF_ISO)
return (0);
- IFDEBUG(D_ROUTE)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ROUTE]) {
printf(">>> iso_ifwithidi addr\n");
dump_isoaddr(satosiso(addr));
printf("\n");
- ENDDEBUG
+ }
+#endif
for (ifp = ifnet.tqh_first; ifp != 0; ifp = ifp->if_list.tqe_next) {
- IFDEBUG(D_ROUTE)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ROUTE]) {
printf("iso_ifwithidi ifnet %s\n", ifp->if_name);
- ENDDEBUG
+ }
+#endif
for (ifa = ifp->if_addrlist.tqh_first; ifa != 0;
- ifa = ifa->ifa_list.tqe_next) {
- IFDEBUG(D_ROUTE)
+ ifa = ifa->ifa_list.tqe_next) {
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ROUTE]) {
printf("iso_ifwithidi address ");
dump_isoaddr(satosiso(ifa->ifa_addr));
- ENDDEBUG
+ }
+#endif
if (ifa->ifa_addr->sa_family != addr->sa_family)
continue;
- IFDEBUG(D_ROUTE)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ROUTE]) {
printf(" af same, args to iso_eqtype:\n");
printf("0x%x ", satosiso(ifa->ifa_addr)->siso_addr);
printf(" 0x%x\n",
- &satosiso(addr)->siso_addr));
- ENDDEBUG
+ &satosiso(addr)->siso_addr));
+ }
+#endif
- if (iso_eqtype(&satosiso(ifa->ifa_addr)->siso_addr,
- &satosiso(addr)->siso_addr)) {
- IFDEBUG(D_ROUTE)
+ if (iso_eqtype(&satosiso(ifa->ifa_addr)->siso_addr,
+ &satosiso(addr)->siso_addr)) {
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ROUTE]) {
printf("ifa_ifwithidi: ifa found\n");
- ENDDEBUG
+ }
+#endif
return (ifa);
}
- IFDEBUG(D_ROUTE)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ROUTE]) {
printf(" iso_eqtype failed\n");
- ENDDEBUG
+ }
+#endif
}
}
- return ((struct ifaddr *)0);
+ return ((struct ifaddr *) 0);
}
-#endif /* notdef */
+#endif /* notdef */
/*
* FUNCTION: iso_ck_addr
*
- * PURPOSE: return true if the iso_addr passed is
- * within the legal size limit for an iso address.
+ * PURPOSE: return true if the iso_addr passed is
+ * within the legal size limit for an iso address.
*
- * RETURNS: true or false
+ * RETURNS: true or false
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
*/
+int
iso_ck_addr(isoa)
-struct iso_addr *isoa; /* address to check */
+ struct iso_addr *isoa; /* address to check */
{
return (isoa->isoa_len <= 20);
/*
* FUNCTION: iso_eqtype
*
- * PURPOSE: Determine if two iso addresses are of the same type.
- * This is flaky. Really we should consider all type 47 addrs to be the
- * same - but there do exist different structures for 47 addrs.
- * Gosip adds a 3rd.
+ * PURPOSE: Determine if two iso addresses are of the same type.
+ * This is flaky. Really we should consider all type
+ * 47 addrs to be the same - but there do exist different
+ * structures for 47 addrs. Gosip adds a 3rd.
*
- * RETURNS: true if the addresses are the same type
+ * RETURNS: true if the addresses are the same type
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES: By type, I mean rfc986, t37, or osinet
+ * NOTES: By type, I mean rfc986, t37, or osinet
*
- * This will first compare afis. If they match, then
- * if the addr is not t37, the idis must be compared.
+ * This will first compare afis. If they match, then
+ * if the addr is not t37, the idis must be compared.
*/
+int
iso_eqtype(isoaa, isoab)
-struct iso_addr *isoaa; /* first addr to check */
-struct iso_addr *isoab; /* other addr to check */
+ struct iso_addr *isoaa; /* first addr to check */
+ struct iso_addr *isoab; /* other addr to check */
{
if (isoaa->isoa_afi == isoab->isoa_afi) {
if (isoaa->isoa_afi == AFI_37)
- return(1);
- else
+ return (1);
+ else
return (!bcmp(&isoaa->isoa_u, &isoab->isoa_u, 2));
}
- return(0);
+ return (0);
}
#endif /* notdef */
/*
* FUNCTION: iso_localifa()
*
- * PURPOSE: Find an interface addresss having a given destination
- * or at least matching the net.
+ * PURPOSE: Find an interface addresss having a given destination
+ * or at least matching the net.
*
- * RETURNS: ptr to an interface address
+ * RETURNS: ptr to an interface address
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
*/
struct iso_ifaddr *
iso_localifa(siso)
register struct sockaddr_iso *siso;
{
register struct iso_ifaddr *ia;
- register char *cp1, *cp2, *cp3;
+ register char *cp1, *cp2, *cp3;
register struct ifnet *ifp;
struct iso_ifaddr *ia_maybe = 0;
/*
continue;
if (ifp->if_flags & IFF_POINTOPOINT) {
if ((ia->ia_dstaddr.siso_family == AF_ISO) &&
- SAME_ISOADDR(&ia->ia_dstaddr, siso))
+ SAME_ISOADDR(&ia->ia_dstaddr, siso))
return (ia);
- else
- if (SAME_ISOADDR(&ia->ia_addr, siso))
- ia_maybe = ia;
+ else if (SAME_ISOADDR(&ia->ia_addr, siso))
+ ia_maybe = ia;
continue;
}
if (ia->ia_sockmask.siso_len) {
- char *cplim = ia->ia_sockmask.siso_len + (char *)&ia->ia_sockmask;
+ char *cplim = ia->ia_sockmask.siso_len +
+ (char *) &ia->ia_sockmask;
cp1 = ia->ia_sockmask.siso_data;
cp2 = siso->siso_data;
cp3 = ia->ia_addr.siso_data;
}
if (SAME_ISOADDR(&ia->ia_addr, siso))
return ia;
- next:;
+next: ;
}
return ia_maybe;
}
/*
* FUNCTION: iso_nlctloutput
*
- * PURPOSE: Set options at the network level
+ * PURPOSE: Set options at the network level
*
- * RETURNS: E*
+ * RETURNS: E*
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES: This could embody some of the functions of
- * rclnp_ctloutput and cons_ctloutput.
+ * NOTES: This could embody some of the functions of
+ * rclnp_ctloutput and cons_ctloutput.
*/
+int
iso_nlctloutput(cmd, optname, pcb, m)
-int cmd; /* command:set or get */
-int optname; /* option of interest */
-caddr_t pcb; /* nl pcb */
-struct mbuf *m; /* data for set, buffer for get */
+ int cmd; /* command:set or get */
+ int optname;/* option of interest */
+ caddr_t pcb; /* nl pcb */
+ struct mbuf *m; /* data for set, buffer for get */
{
- struct isopcb *isop = (struct isopcb *)pcb;
- int error = 0; /* return value */
- caddr_t data; /* data for option */
- int data_len; /* data's length */
+#ifdef TPCONS
+ struct isopcb *isop = (struct isopcb *) pcb;
+#endif
+ int error = 0; /* return value */
+ caddr_t data; /* data for option */
+ int data_len; /* data's length */
- IFDEBUG(D_ISO)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ISO]) {
printf("iso_nlctloutput: cmd %x, opt %x, pcb %x, m %x\n",
- cmd, optname, pcb, m);
- ENDDEBUG
+ cmd, optname, (unsigned int) pcb, (unsigned int) m);
+ }
+#endif
if ((cmd != PRCO_GETOPT) && (cmd != PRCO_SETOPT))
- return(EOPNOTSUPP);
+ return (EOPNOTSUPP);
data = mtod(m, caddr_t);
data_len = (m)->m_len;
- IFDEBUG(D_ISO)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ISO]) {
printf("iso_nlctloutput: data is:\n");
dump_buf(data, data_len);
- ENDDEBUG
+ }
+#endif
switch (optname) {
#ifdef TPCONS
- case CONSOPT_X25CRUD:
- if (cmd == PRCO_GETOPT) {
- error = EOPNOTSUPP;
- break;
- }
-
- if (data_len > MAXX25CRUDLEN) {
- error = EINVAL;
- break;
- }
-
- IFDEBUG(D_ISO)
- printf("iso_nlctloutput: setting x25 crud\n");
- ENDDEBUG
-
- bcopy(data, (caddr_t)isop->isop_x25crud, (unsigned)data_len);
- isop->isop_x25crud_len = data_len;
+ case CONSOPT_X25CRUD:
+ if (cmd == PRCO_GETOPT) {
+ error = EOPNOTSUPP;
break;
-#endif /* TPCONS */
+ }
+ if (data_len > MAXX25CRUDLEN) {
+ error = EINVAL;
+ break;
+ }
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ISO]) {
+ printf("iso_nlctloutput: setting x25 crud\n");
+ }
+#endif
- default:
- error = EOPNOTSUPP;
+ bcopy(data, (caddr_t) isop->isop_x25crud, (unsigned) data_len);
+ isop->isop_x25crud_len = data_len;
+ break;
+#endif /* TPCONS */
+
+ default:
+ error = EOPNOTSUPP;
}
if (cmd == PRCO_SETOPT)
m_freem(m);
/*
* FUNCTION: dump_isoaddr
*
- * PURPOSE: debugging
+ * PURPOSE: debugging
*
- * RETURNS: nada
+ * RETURNS: nada
*
*/
+void
dump_isoaddr(s)
struct sockaddr_iso *s;
{
- char *clnp_saddr_isop();
- register int i;
-
- if( s->siso_family == AF_ISO) {
+ if (s->siso_family == AF_ISO) {
printf("ISO address: suffixlen %d, %s\n",
- s->siso_tlen, clnp_saddr_isop(s));
- } else if( s->siso_family == AF_INET) {
+ s->siso_tlen, clnp_saddr_isop(s));
+ } else if (s->siso_family == AF_INET) {
/* hack */
struct sockaddr_in *sin = satosin(s);
- printf("%d.%d.%d.%d: %d",
- (sin->sin_addr.s_addr>>24)&0xff,
- (sin->sin_addr.s_addr>>16)&0xff,
- (sin->sin_addr.s_addr>>8)&0xff,
- (sin->sin_addr.s_addr)&0xff,
- sin->sin_port);
+ printf("%d.%d.%d.%d: %d",
+ (sin->sin_addr.s_addr >> 24) & 0xff,
+ (sin->sin_addr.s_addr >> 16) & 0xff,
+ (sin->sin_addr.s_addr >> 8) & 0xff,
+ (sin->sin_addr.s_addr) & 0xff,
+ sin->sin_port);
}
}
-/* $NetBSD: iso.h,v 1.7 1995/06/13 07:13:31 mycroft Exp $ */
+/* $OpenBSD: iso.h,v 1.2 1996/03/04 10:35:28 mickey Exp $ */
+/* $NetBSD: iso.h,v 1.8 1996/02/13 22:09:58 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
/*
* Return true if this is a multicast address
- * This assumes that the bit transmission is lsb first. This
+ * 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_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_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_RAW 255 /* raw clnp */
#define ISOPROTO_MAX 256
#define ISO_PORT_RESERVED 1024
/*
* Port/socket numbers: public use
*/
-#define ISO_PORT_PUBLIC 1024 /* high bit set --> public */
+#define ISO_PORT_PUBLIC 1024 /* high bit set --> public */
/*
* Network layer protocol identifiers
#ifndef IN_CLASSA_NET
#include <netinet/in.h>
-#endif /* IN_CLASSA_NET */
+#endif /* IN_CLASSA_NET */
-/* The following looks like a sockaddr
- * to facilitate using tree lookup routines */
+/*
+ * 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 */
+ u_char isoa_len; /* length (in bytes) */
+ char isoa_genaddr[20]; /* general opaque address */
};
struct sockaddr_iso {
- u_char siso_len; /* length */
- u_char 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 */
+ u_char siso_len; /* length */
+ u_char 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 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...*/
+#define AFI_SNA 0x00 /* SubNetwork Address; invalid really... */
#ifdef _KERNEL
-extern int iso_netmatch();
-extern int iso_hash();
-extern int iso_addrmatch();
-extern struct iso_ifaddr *iso_iaonnetof();
-extern struct domain isodomain;
-extern struct protosw isosw[];
+extern struct domain isodomain;
+extern struct protosw isosw[];
#define satosiso(sa) ((struct sockaddr_iso *)(sa))
#define sisotosa(siso) ((struct sockaddr *)(siso))
__BEGIN_DECLS
struct iso_addr *iso_addr __P((const char *));
-char *iso_ntoa __P((const struct iso_addr *));
+char *iso_ntoa __P((const struct iso_addr *));
/* THESE DON'T EXIST YET */
struct hostent *iso_gethostbyname(), *iso_gethostbyaddr();
-/* $NetBSD: iso_chksum.c,v 1.5 1994/06/29 06:39:43 cgd Exp $ */
+/* $OpenBSD: iso_chksum.c,v 1.2 1996/03/04 10:35:30 mickey Exp $ */
+/* $NetBSD: iso_chksum.c,v 1.6 1996/02/13 22:10:01 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
/*
* ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison
*/
-/*
+/*
* ISO CHECKSUM
*
- * The checksum generation and check routines are here.
- * The checksum is 2 bytes such that the sum of all the bytes b(i) == 0
- * and the sum of i * b(i) == 0.
+ * The checksum generation and check routines are here. The checksum is 2 bytes
+ * such that the sum of all the bytes b(i) == 0 and the sum of i * b(i) == 0.
* The whole thing is complicated by the fact that the data are in mbuf
- * chains.
- * Furthermore, there is the possibility of wraparound in the running
- * sums after adding up 4102 octets. In order to avoid doing a mod
- * operation after EACH add, we have restricted this implementation to
- * negotiating a maximum of 4096-octets per TPDU (for the transport layer).
- * The routine iso_check_csum doesn't need to know where the checksum
- * octets are.
- * The routine iso_gen_csum takes a pointer to an mbuf chain (logically
- * a chunk of data), an offset into the chunk at which the 2 octets are to
- * be stuffed, and the length of the chunk. The 2 octets have to be
- * logically adjacent, but may be physically located in separate mbufs.
+ * chains. Furthermore, there is the possibility of wraparound in the running
+ * sums after adding up 4102 octets. In order to avoid doing a mod operation
+ * after EACH add, we have restricted this implementation to negotiating a
+ * maximum of 4096-octets per TPDU (for the transport layer). The routine
+ * iso_check_csum doesn't need to know where the checksum octets are. The
+ * routine iso_gen_csum takes a pointer to an mbuf chain (logically a chunk
+ * of data), an offset into the chunk at which the 2 octets are to be
+ * stuffed, and the length of the chunk. The 2 octets have to be logically
+ * adjacent, but may be physically located in separate mbufs.
*/
#ifdef ISO
-#include <netiso/argo_debug.h>
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/mbuf.h>
+#include <sys/socket.h>
+#include <net/if.h>
+#include <netiso/argo_debug.h>
+#include <netiso/iso.h>
+#include <netiso/iso_var.h>
#endif /* ISO */
-#ifndef MNULL
-#define MNULL (struct mbuf *)0
-#endif /* MNULL */
-
/*
* FUNCTION: iso_check_csum
*
- * PURPOSE: To check the checksum of the packet in the mbuf chain (m).
- * The total length of the packet is (len).
- * Called from tp_input() and clnp_intr()
+ * PURPOSE: To check the checksum of the packet in the mbuf chain (m).
+ * The total length of the packet is (len).
+ * Called from tp_input() and clnp_intr()
*
- * RETURNS: TRUE (something non-zero) if there is a checksum error,
- * FALSE if there was NO checksum error.
+ * RETURNS: TRUE (something non-zero) if there is a checksum error,
+ * FALSE if there was NO checksum error.
*
* SIDE EFFECTS: none
*
- * NOTES: It might be possible to gain something by optimizing
+ * NOTES: It might be possible to gain something by optimizing
* this routine (unrolling loops, etc). But it is such
- * a horrible thing to fiddle with anyway, it probably
- * isn't worth it.
+ * a horrible thing to fiddle with anyway, it probably
+ * isn't worth it.
*/
-int
+int
iso_check_csum(m, len)
- struct mbuf *m;
- int len;
+ struct mbuf *m;
+ int len;
{
register u_char *p = mtod(m, u_char *);
- register u_long c0=0, c1=0;
- register int i=0;
- int cum = 0; /* cumulative length */
- int l;
+ register u_long c0 = 0, c1 = 0;
+ register int i = 0;
+ int cum = 0;/* cumulative length */
+ int l;
l = len;
len = min(m->m_len, len);
i = 0;
- IFDEBUG(D_CHKSUM)
- printf("iso_check_csum: m x%x, l x%x, m->m_len x%x\n", m, l, m->m_len);
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CHKSUM]) {
+ printf("iso_check_csum: m x%x, l x%x, m->m_len x%x\n",
+ (unsigned int) m, l, m->m_len);
+ }
+#endif
- while( i<l ) {
+ while (i < l) {
cum += len;
- while (i<cum) {
+ while (i < cum) {
c0 = c0 + *(p++);
c1 += c0;
i++;
}
- if(i < l) {
+ if (i < l) {
m = m->m_next;
- IFDEBUG(D_CHKSUM)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CHKSUM]) {
printf("iso_check_csum: new mbuf\n");
- if(l-i < m->m_len)
+ if (l - i < m->m_len)
printf(
- "bad mbuf chain in check csum l 0x%x i 0x%x m_data 0x%x",
- l,i,m->m_data);
- ENDDEBUG
- ASSERT( m != MNULL);
- len = min( m->m_len, l-i);
+ "bad mbuf chain in check csum l 0x%x i 0x%x m_data 0x%x",
+ l, i, (unsigned int) m->m_data);
+ }
+#endif
+ ASSERT(m != NULL);
+ len = min(m->m_len, l - i);
p = mtod(m, u_char *);
}
}
- if ( ((int)c0 % 255) || ((int)c1 % 255) ) {
- IFDEBUG(D_CHKSUM)
- printf("BAD iso_check_csum l 0x%x cum 0x%x len 0x%x, i 0x%x",
- l, cum, len, i);
- ENDDEBUG
- return ((int)c0 % 255)<<8 | ((int)c1 % 255);
+ if (((int) c0 % 255) || ((int) c1 % 255)) {
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CHKSUM]) {
+ printf("BAD iso_check_csum l 0x%x cum 0x%x len 0x%x, i 0x%x",
+ l, cum, len, i);
+ }
+#endif
+ return ((int) c0 % 255) << 8 | ((int) c1 % 255);
}
return 0;
}
/*
* FUNCTION: iso_gen_csum
*
- * PURPOSE: To generate the checksum of the packet in the mbuf chain (m).
- * The first of the 2 (logically) adjacent checksum bytes
- * (x and y) go at offset (n).
- * (n) is an offset relative to the beginning of the data,
- * not the beginning of the mbuf.
- * (l) is the length of the total mbuf chain's data.
- * Called from tp_emit(), tp_error_emit()
- * clnp_emit_er(), clnp_forward(), clnp_output().
+ * PURPOSE: To generate the checksum of the packet in the mbuf chain (m).
+ * The first of the 2 (logically) adjacent checksum bytes
+ * (x and y) go at offset (n).
+ * (n) is an offset relative to the beginning of the data,
+ * not the beginning of the mbuf.
+ * (l) is the length of the total mbuf chain's data.
+ * Called from tp_emit(), tp_error_emit()
+ * clnp_emit_er(), clnp_forward(), clnp_output().
*
- * RETURNS: Rien
+ * RETURNS: Rien
*
* SIDE EFFECTS: Puts the 2 checksum bytes into the packet.
*
- * NOTES: Ditto the note for iso_check_csum().
+ * NOTES: Ditto the note for iso_check_csum().
*/
void
-iso_gen_csum(m,n,l)
- struct mbuf *m;
- int n; /* offset of 2 checksum bytes */
- int l;
+iso_gen_csum(m, n, l)
+ struct mbuf *m;
+ int n; /* offset of 2 checksum bytes */
+ int l;
{
register u_char *p = mtod(m, u_char *);
- register int c0=0, c1=0;
- register int i=0;
- int loc = n++, len=0; /* n is position, loc is offset */
- u_char *xloc;
- u_char *yloc;
- int cum=0; /* cum == cumulative length */
-
- IFDEBUG(D_CHKSUM)
- printf("enter gen csum m 0x%x n 0x%x l 0x%x\n",m, n-1 ,l );
- ENDDEBUG
+ register int c0 = 0, c1 = 0;
+ register int i = 0;
+ int loc = n++, len = 0; /* n is position, loc is
+ * offset */
+ u_char *xloc = NULL;
+ u_char *yloc = NULL;
+ int cum = 0;/* cum == cumulative length */
+
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CHKSUM]) {
+ printf("enter gen csum m 0x%x n 0x%x l 0x%x\n",
+ (unsigned int) m, n - 1, l);
+ }
+#endif
- while(i < l) {
+ while (i < l) {
len = min(m->m_len, CLBYTES);
/* RAH: don't cksum more than l bytes */
len = min(len, l - i);
- cum +=len;
+ cum += len;
p = mtod(m, u_char *);
- if(loc>=0) {
+ if (loc >= 0) {
if (loc < len) {
xloc = loc + mtod(m, u_char *);
- IFDEBUG(D_CHKSUM)
- printf("1: zeroing xloc 0x%x loc 0x%x\n",xloc, loc );
- ENDDEBUG
- *xloc = (u_char)0;
- if (loc+1 < len) {
- /* both xloc and yloc are in same mbuf */
- yloc = 1 + xloc;
- IFDEBUG(D_CHKSUM)
- printf("2: zeroing yloc 0x%x loc 0x%x\n",yloc, loc );
- ENDDEBUG
- *yloc = (u_char)0;
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CHKSUM]) {
+ printf(
+ "1: zeroing xloc 0x%x loc 0x%x\n",
+ (unsigned int) xloc,
+ (unsigned int) loc);
+ }
+#endif
+ *xloc = (u_char) 0;
+ if (loc + 1 < len) {
+ /*
+ * both xloc and yloc are in same
+ * mbuf
+ */
+ yloc = 1 + xloc;
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CHKSUM]) {
+ printf(
+ "2: zeroing yloc 0x%x loc 0x%x\n",
+ (unsigned int) yloc, loc);
+ }
+#endif
+ *yloc = (u_char) 0;
} else {
/* crosses boundary of mbufs */
yloc = mtod(m->m_next, u_char *);
- IFDEBUG(D_CHKSUM)
- printf("3: zeroing yloc 0x%x \n",yloc );
- ENDDEBUG
- *yloc = (u_char)0;
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CHKSUM]) {
+ printf(
+ "3: zeroing yloc 0x%x \n",
+ (unsigned int) yloc);
+ }
+#endif
+ *yloc = (u_char) 0;
}
}
loc -= len;
}
-
- while(i < cum) {
+ while (i < cum) {
c0 = (c0 + *p);
- c1 += c0 ;
- i++;
+ c1 += c0;
+ i++;
p++;
}
m = m->m_next;
}
- IFDEBUG(D_CHKSUM)
- printf("gen csum final xloc 0x%x yloc 0x%x\n",xloc, yloc );
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CHKSUM]) {
+ printf("gen csum final xloc 0x%x yloc 0x%x\n",
+ (unsigned int) xloc, (unsigned int) yloc);
+ }
+#endif
- c1 = (((c0 * (l-n))-c1)%255) ;
- *xloc = (u_char) ((c1 < 0)? c1+255 : c1);
+ c1 = (((c0 * (l - n)) - c1) % 255);
+ *xloc = (u_char) ((c1 < 0) ? c1 + 255 : c1);
- c1 = (-(int)(c1+c0))%255;
- *yloc = (u_char) (c1 < 0? c1 + 255 : c1);
+ c1 = (-(int) (c1 + c0)) % 255;
+ *yloc = (u_char) (c1 < 0 ? c1 + 255 : c1);
- IFDEBUG(D_CHKSUM)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CHKSUM]) {
printf("gen csum end \n");
- ENDDEBUG
+ }
+#endif
}
/*
* FUNCTION: m_datalen
*
- * PURPOSE: returns length of the mbuf chain.
- * used all over the iso code.
+ * PURPOSE: returns length of the mbuf chain.
+ * used all over the iso code.
*
- * RETURNS: integer
+ * RETURNS: integer
*
* SIDE EFFECTS: none
*
- * NOTES:
+ * NOTES:
*/
int
-m_datalen (m)
+m_datalen(m)
register struct mbuf *m;
-{
- register int datalen;
+{
+ register int datalen;
for (datalen = 0; m; m = m->m_next)
datalen += m->m_len;
m_compress(in, out)
register struct mbuf *in, **out;
{
- register int datalen = 0;
- int s = splimp();
+ register int datalen = 0;
+ int s = splimp();
- if( in->m_next == MNULL ) {
+ if (in->m_next == NULL) {
*out = in;
- IFDEBUG(D_REQUEST)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_REQUEST]) {
printf("m_compress returning 0x%x: A\n", in->m_len);
- ENDDEBUG
+ }
+#endif
splx(s);
return in->m_len;
}
MGET((*out), M_DONTWAIT, MT_DATA);
- if((*out) == MNULL) {
+ if ((*out) == NULL) {
*out = in;
- IFDEBUG(D_REQUEST)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_REQUEST]) {
printf("m_compress returning -1: B\n");
- ENDDEBUG
+ }
+#endif
splx(s);
- return -1;
+ return -1;
}
(*out)->m_len = 0;
- (*out)->m_act = MNULL;
+ (*out)->m_act = NULL;
while (in) {
- IFDEBUG(D_REQUEST)
- printf("m_compress in 0x%x *out 0x%x\n", in, *out);
- printf("m_compress in: len 0x%x, off 0x%x\n", in->m_len, in->m_data);
- printf("m_compress *out: len 0x%x, off 0x%x\n", (*out)->m_len,
- (*out)->m_data);
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_REQUEST]) {
+ printf("m_compress in 0x%x *out 0x%x\n",
+ (unsigned int) in, (unsigned int) *out);
+ printf("m_compress in: len 0x%x, off 0x%x\n",
+ in->m_len, (unsigned int) in->m_data);
+ printf("m_compress *out: len 0x%x, off 0x%x\n",
+ (*out)->m_len, (unsigned int) (*out)->m_data);
+ }
+#endif
if (in->m_flags & M_EXT) {
ASSERT(in->m_len == 0);
}
- if ( in->m_len == 0) {
+ if (in->m_len == 0) {
in = in->m_next;
continue;
}
if (((*out)->m_flags & M_EXT) == 0) {
- int len;
+ int len;
len = M_TRAILINGSPACE(*out);
len = min(len, in->m_len);
datalen += len;
- IFDEBUG(D_REQUEST)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_REQUEST]) {
printf("m_compress copying len %d\n", len);
- ENDDEBUG
+ }
+#endif
bcopy(mtod(in, caddr_t), mtod((*out), caddr_t) + (*out)->m_len,
- (unsigned)len);
+ (unsigned) len);
(*out)->m_len += len;
in->m_len -= len;
continue;
} else {
/* (*out) is full */
- if(( (*out)->m_next = m_get(M_DONTWAIT, MT_DATA) ) == MNULL) {
+ if (((*out)->m_next = m_get(M_DONTWAIT, MT_DATA)) == NULL) {
m_freem(*out);
*out = in;
- IFDEBUG(D_REQUEST)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_REQUEST]) {
printf("m_compress returning -1: B\n");
- ENDDEBUG
+ }
+#endif
splx(s);
return -1;
}
(*out)->m_len = 0;
- (*out)->m_act = MNULL;
+ (*out)->m_act = NULL;
*out = (*out)->m_next;
}
}
m_freem(in);
- IFDEBUG(D_REQUEST)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_REQUEST]) {
printf("m_compress returning 0x%x: A\n", datalen);
- ENDDEBUG
+ }
+#endif
splx(s);
return datalen;
}
-/* $NetBSD: iso_errno.h,v 1.6 1995/03/08 02:16:13 cgd Exp $ */
+/* $OpenBSD: iso_errno.h,v 1.2 1996/03/04 10:35:32 mickey Exp $ */
+/* $NetBSD: iso_errno.h,v 1.7 1996/02/13 22:10:08 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
#define ISO_ERROR_MASK 0x8000
#define BSD_ERROR_MASK 0x0000
#define TP_ERROR_MASK 0x8800 /* transport layer */
-#define CONL_ERROR_MASK 0x8400 /* co network layer */
+#define CONL_ERROR_MASK 0x8400 /* co network layer */
#define CLNL_ERROR_MASK 0x8200 /* cl network layer */
#define TP_ERROR_SNDC 0x10000 /* kludge to force DC's on certain errors */
#define E_CO_NOERROR (CONL_ERROR_MASK | 0x0) /* no add'l info */
/******************************************************************************/
-/* */
-/* */
-/* Transport Layer */
-/* */
-/* */
+/* */
+/* */
+/* Transport Layer */
+/* */
+/* */
/******************************************************************************/
-#define E_TP_DR_NO_REAS (TP_ERROR_MASK | 0x0) /* dr reason not specified*/
-#define E_TP_CONGEST (TP_ERROR_MASK | 0x1) /* dr reason congestion */
-#define E_TP_NO_SESSION (TP_ERROR_MASK | 0x2) /* dr reason no sess ent */
-#define E_TP_ADDR_UNK (TP_ERROR_MASK | 0x3) /* dr reason addr unknown */
+#define E_TP_DR_NO_REAS (TP_ERROR_MASK | 0x0) /* dr reason not specified */
+#define E_TP_CONGEST (TP_ERROR_MASK | 0x1) /* dr reason congestion */
+#define E_TP_NO_SESSION (TP_ERROR_MASK | 0x2) /* dr reason no sess ent */
+#define E_TP_ADDR_UNK (TP_ERROR_MASK | 0x3) /* dr reason addr unknown */
-#define E_TP_ER_NO_REAS (TP_ERROR_MASK | 0x40) /* er reas not specified */
-#define E_TP_INV_PCODE (TP_ERROR_MASK | 0x41) /* er reas invalid parm code */
-#define E_TP_INV_TPDU (TP_ERROR_MASK | 0x42) /* er reas invalid tpdu type */
-#define E_TP_INV_PVAL (TP_ERROR_MASK | 0x43) /* er reas invalid parm value*/
+#define E_TP_ER_NO_REAS (TP_ERROR_MASK | 0x40) /* er reas not specified */
+#define E_TP_INV_PCODE (TP_ERROR_MASK | 0x41) /* er reas invalid parm code */
+#define E_TP_INV_TPDU (TP_ERROR_MASK | 0x42) /* er reas invalid tpdu type */
+#define E_TP_INV_PVAL (TP_ERROR_MASK | 0x43) /* er reas invalid parm value */
-#define E_TP_NORMAL_DISC (TP_ERROR_MASK | 0x80) /* dr reas normal disc */
-#define E_TP_CONGEST_2 (TP_ERROR_MASK | 0x81) /* dr reason congestion */
-#define E_TP_NEGOT_FAILED (TP_ERROR_MASK | 0x82) /* dr negotiation failed */
-#define E_TP_DUPL_SRCREF (TP_ERROR_MASK | 0x83) /* dr duplicate src ref */
-#define E_TP_MISM_REFS (TP_ERROR_MASK | 0x84) /* dr mismatched references*/
-#define E_TP_PROTO_ERR (TP_ERROR_MASK | 0x85) /* dr protocol error*/
+#define E_TP_NORMAL_DISC (TP_ERROR_MASK | 0x80) /* dr reas normal disc */
+#define E_TP_CONGEST_2 (TP_ERROR_MASK | 0x81) /* dr reason congestion */
+#define E_TP_NEGOT_FAILED (TP_ERROR_MASK | 0x82) /* dr negotiation failed */
+#define E_TP_DUPL_SRCREF (TP_ERROR_MASK | 0x83) /* dr duplicate src ref */
+#define E_TP_MISM_REFS (TP_ERROR_MASK | 0x84) /* dr mismatched references */
+#define E_TP_PROTO_ERR (TP_ERROR_MASK | 0x85) /* dr protocol error */
/* 0x86 not used */
-#define E_TP_REF_OVERFLOW (TP_ERROR_MASK | 0x87) /* dr reference overflow */
-#define E_TP_NO_CR_ON_NC (TP_ERROR_MASK | 0x88) /* dr cr refused on this nc */
+#define E_TP_REF_OVERFLOW (TP_ERROR_MASK | 0x87) /* dr reference overflow */
+#define E_TP_NO_CR_ON_NC (TP_ERROR_MASK | 0x88) /* dr cr refused on this nc */
/* 0x89 not used */
-#define E_TP_LENGTH_INVAL (TP_ERROR_MASK | 0x8a) /* dr inval length in hdr*/
+#define E_TP_LENGTH_INVAL (TP_ERROR_MASK | 0x8a) /* dr inval length in
+ * hdr */
/******************************************************************************/
-/* */
-/* */
-/* Connection Less Network Layer */
-/* */
-/* */
+/* */
+/* */
+/* Connection Less Network Layer */
+/* */
+/* */
/******************************************************************************/
-#ifdef notdef /* This doesn't look like legal C to me or the compiler. */
-#define E_CLNL_??? (CLNL_ERROR_MASK | 0x1) /* explanation */
+#ifdef notdef /* This doesn't look like legal C to me or
+ * the compiler. */
+#define E_CLNL_??? (CLNL_ERROR_MASK | 0x1) /* explanation */
#endif
/******************************************************************************/
-/* */
-/* */
-/* Connection Oriented Network Layer */
-/* */
-/* */
+/* */
+/* */
+/* Connection Oriented Network Layer */
+/* */
+/* */
/******************************************************************************/
- /* see p. 149 of ISO 8208 */
+/* see p. 149 of ISO 8208 */
#define E_CO_NOERROR (CONL_ERROR_MASK | 0x0) /* no add'l info */
#define E_CO_INV_PS (CONL_ERROR_MASK | 0x1) /* invalid p(s) */
#define E_CO_INV_PR (CONL_ERROR_MASK | 0x2) /* invalid p(r) */
- /* dot dot dot */
-#define E_CO_INV_PKT_TYPE (CONL_ERROR_MASK | 0x10) /* packet type invalid*/
+/* dot dot dot */
+#define E_CO_INV_PKT_TYPE (CONL_ERROR_MASK | 0x10) /* packet type invalid */
#define E_CO_INV_PKT_R1 (CONL_ERROR_MASK | 0x11) /* for state r1 */
#define E_CO_INV_PKT_R2 (CONL_ERROR_MASK | 0x12) /* for state r2 */
#define E_CO_INV_PKT_R3 (CONL_ERROR_MASK | 0x13) /* for state r3 */
#define E_CO_INV_PKT_D1 (CONL_ERROR_MASK | 0x1b) /* for state d1 */
#define E_CO_INV_PKT_D2 (CONL_ERROR_MASK | 0x1c) /* for state d2 */
#define E_CO_INV_PKT_D3 (CONL_ERROR_MASK | 0x1d) /* for state d3 */
- /* dot dot dot */
-#define E_CO_PKT_NOT_ALWD (CONL_ERROR_MASK | 0x20) /* packet not allowed */
-#define E_CO_PNA_UNIDENT (CONL_ERROR_MASK | 0x21) /* unidentifiable pkt */
-#define E_CO_PNA_ONEWAY (CONL_ERROR_MASK | 0x22) /* call on 1-way lc */
-#define E_CO_PNA_PVC (CONL_ERROR_MASK | 0x23) /* inv pkt type on a pvc */
-#define E_CO_PNA_UNASSLC (CONL_ERROR_MASK | 0x24) /* pkt on unassigned lc */
-#define E_CO_PNA_REJECT (CONL_ERROR_MASK | 0x25) /* REJ not subscribed to*/
-#define E_CO_PNA_SHORT (CONL_ERROR_MASK | 0x26) /* pkt too short */
-#define E_CO_PNA_LONG (CONL_ERROR_MASK | 0x27) /* pkt too long */
-#define E_CO_PNA_INVGFI (CONL_ERROR_MASK | 0x28) /* inv gen format id */
+/* dot dot dot */
+#define E_CO_PKT_NOT_ALWD (CONL_ERROR_MASK | 0x20) /* packet not allowed */
+#define E_CO_PNA_UNIDENT (CONL_ERROR_MASK | 0x21) /* unidentifiable pkt */
+#define E_CO_PNA_ONEWAY (CONL_ERROR_MASK | 0x22) /* call on 1-way lc */
+#define E_CO_PNA_PVC (CONL_ERROR_MASK | 0x23) /* inv pkt type on a pvc */
+#define E_CO_PNA_UNASSLC (CONL_ERROR_MASK | 0x24) /* pkt on unassigned lc */
+#define E_CO_PNA_REJECT (CONL_ERROR_MASK | 0x25) /* REJ not subscribed to */
+#define E_CO_PNA_SHORT (CONL_ERROR_MASK | 0x26) /* pkt too short */
+#define E_CO_PNA_LONG (CONL_ERROR_MASK | 0x27) /* pkt too long */
+#define E_CO_PNA_INVGFI (CONL_ERROR_MASK | 0x28) /* inv gen format id */
#define E_CO_PNA_NZLCI (CONL_ERROR_MASK | 0x29) \
- /* restart or reg pkt with nonzero logical channel identifier */
+ /* restart or reg pkt with nonzero logical
+ * channel identifier */
#define E_CO_PNA_FACIL (CONL_ERROR_MASK | 0x2a) \
- /* pkt type not compat with facility */
+ /* pkt type not compat with facility */
#define E_CO_PNA_UINTCON (CONL_ERROR_MASK | 0x2b) /* unauthor intrpt conf */
-#define E_CO_PNA_UINTRPT (CONL_ERROR_MASK | 0x2c) /* unauthorized intrpt */
-#define E_CO_PNA_UREJECT (CONL_ERROR_MASK | 0x2d) /* unauthorized reject */
+#define E_CO_PNA_UINTRPT (CONL_ERROR_MASK | 0x2c) /* unauthorized intrpt */
+#define E_CO_PNA_UREJECT (CONL_ERROR_MASK | 0x2d) /* unauthorized reject */
-#define E_CO_TMR_EXP (CONL_ERROR_MASK | 0x30) /* timer expired */
-#define E_CO_TMR_CALR (CONL_ERROR_MASK | 0x31) /* inc. call or call req */
-#define E_CO_TMR_CLRI (CONL_ERROR_MASK | 0x32) /* clear indication */
-#define E_CO_TMR_RSTI (CONL_ERROR_MASK | 0x33) /* reset indication */
-#define E_CO_TMR_RRTI (CONL_ERROR_MASK | 0x34) /* restart indication */
+#define E_CO_TMR_EXP (CONL_ERROR_MASK | 0x30) /* timer expired */
+#define E_CO_TMR_CALR (CONL_ERROR_MASK | 0x31) /* inc. call or call req */
+#define E_CO_TMR_CLRI (CONL_ERROR_MASK | 0x32) /* clear indication */
+#define E_CO_TMR_RSTI (CONL_ERROR_MASK | 0x33) /* reset indication */
+#define E_CO_TMR_RRTI (CONL_ERROR_MASK | 0x34) /* restart indication */
#define E_CO_REG_PROB (CONL_ERROR_MASK | 0x40)\
- /* call setup, clear, or registration problem */
-#define E_CO_REG_CODE (CONL_ERROR_MASK | 0x41) /* code not allowed */
-#define E_CO_REG_PARM (CONL_ERROR_MASK | 0x42) /* parameter not allowed */
-#define E_CO_REG_ICDA (CONL_ERROR_MASK | 0x43) /* invalid called addr */
-#define E_CO_REG_ICGA (CONL_ERROR_MASK | 0x44) /* invalid calling addr */
-#define E_CO_REG_ILEN (CONL_ERROR_MASK | 0x45) /* invalid facil length */
-#define E_CO_REG_IBAR (CONL_ERROR_MASK | 0x46) /* incoming call barred */
-#define E_CO_REG_NOLC (CONL_ERROR_MASK | 0x47) /* no logical chan avail*/
-#define E_CO_REG_COLL (CONL_ERROR_MASK | 0x48) /* call collision */
-#define E_CO_REG_DUPF (CONL_ERROR_MASK | 0x49) /* dupl facil requested */
-#define E_CO_REG_NZAL (CONL_ERROR_MASK | 0x4a) /* non-zero addr length */
-#define E_CO_REG_NZFL (CONL_ERROR_MASK | 0x4b) /* non-zero facil length */
+ /* call setup, clear, or registration problem */
+#define E_CO_REG_CODE (CONL_ERROR_MASK | 0x41) /* code not allowed */
+#define E_CO_REG_PARM (CONL_ERROR_MASK | 0x42) /* parameter not allowed */
+#define E_CO_REG_ICDA (CONL_ERROR_MASK | 0x43) /* invalid called addr */
+#define E_CO_REG_ICGA (CONL_ERROR_MASK | 0x44) /* invalid calling addr */
+#define E_CO_REG_ILEN (CONL_ERROR_MASK | 0x45) /* invalid facil length */
+#define E_CO_REG_IBAR (CONL_ERROR_MASK | 0x46) /* incoming call barred */
+#define E_CO_REG_NOLC (CONL_ERROR_MASK | 0x47) /* no logical chan avail */
+#define E_CO_REG_COLL (CONL_ERROR_MASK | 0x48) /* call collision */
+#define E_CO_REG_DUPF (CONL_ERROR_MASK | 0x49) /* dupl facil requested */
+#define E_CO_REG_NZAL (CONL_ERROR_MASK | 0x4a) /* non-zero addr length */
+#define E_CO_REG_NZFL (CONL_ERROR_MASK | 0x4b) /* non-zero facil length */
#define E_CO_REG_EFNP (CONL_ERROR_MASK | 0x4c) \
- /* expected facil not provided */
+ /* expected facil not provided */
#define E_CO_REG_ICCITT (CONL_ERROR_MASK | 0x4d) \
- /* invalid CCITT-specified DTE facil */
+ /* invalid CCITT-specified DTE facil */
-#define E_CO_MISC (CONL_ERROR_MASK | 0x50) /* miscellaneous */
-#define E_CO_MISC_CAUSE (CONL_ERROR_MASK | 0x51) /* improper cause code */
-#define E_CO_MISC_ALIGN (CONL_ERROR_MASK | 0x52) /* not octet-aligned */
+#define E_CO_MISC (CONL_ERROR_MASK | 0x50) /* miscellaneous */
+#define E_CO_MISC_CAUSE (CONL_ERROR_MASK | 0x51) /* improper cause code */
+#define E_CO_MISC_ALIGN (CONL_ERROR_MASK | 0x52) /* not octet-aligned */
#define E_CO_MISC_IQBS (CONL_ERROR_MASK | 0x53) \
- /* inconsistent Q bit settings */
+ /* inconsistent Q bit settings */
-#define E_CO_INTL (CONL_ERROR_MASK | 0x70) /* international problem */
-#define E_CO_IREMNWK (CONL_ERROR_MASK | 0x71) /* remote network problem */
-#define E_CO_INPROTO (CONL_ERROR_MASK | 0x72) /* int'l protocol problem */
-#define E_CO_ILINKDWN (CONL_ERROR_MASK | 0x73) /* int'l link down */
-#define E_CO_ILINKBSY (CONL_ERROR_MASK | 0x74) /* int'l link busy */
-#define E_CO_IXNETFAC (CONL_ERROR_MASK | 0x75) /* transit netwk facil */
-#define E_CO_IRNETFAC (CONL_ERROR_MASK | 0x76) /* remote netwk facil */
-#define E_CO_IROUTING (CONL_ERROR_MASK | 0x77) /* int'l routing prob */
-#define E_CO_ITMPRTG (CONL_ERROR_MASK | 0x78) /* temporary routing prob */
-#define E_CO_IUNKDNIC (CONL_ERROR_MASK | 0x79) /* unknown called DNIC */
+#define E_CO_INTL (CONL_ERROR_MASK | 0x70) /* international problem */
+#define E_CO_IREMNWK (CONL_ERROR_MASK | 0x71) /* remote network
+ * problem */
+#define E_CO_INPROTO (CONL_ERROR_MASK | 0x72) /* int'l protocol
+ * problem */
+#define E_CO_ILINKDWN (CONL_ERROR_MASK | 0x73) /* int'l link down */
+#define E_CO_ILINKBSY (CONL_ERROR_MASK | 0x74) /* int'l link busy */
+#define E_CO_IXNETFAC (CONL_ERROR_MASK | 0x75) /* transit netwk facil */
+#define E_CO_IRNETFAC (CONL_ERROR_MASK | 0x76) /* remote netwk facil */
+#define E_CO_IROUTING (CONL_ERROR_MASK | 0x77) /* int'l routing prob */
+#define E_CO_ITMPRTG (CONL_ERROR_MASK | 0x78) /* temporary routing
+ * prob */
+#define E_CO_IUNKDNIC (CONL_ERROR_MASK | 0x79) /* unknown called DNIC */
#define E_CO_IMAINT (CONL_ERROR_MASK | 0x7a) /* maintenance action */
#define E_CO_TIMO (CONL_ERROR_MASK | 0x90) \
- /* timer expired or retransmission count surpassed */
+ /* timer expired or retransmission count
+ * surpassed */
#define E_CO_TIM_INTRP (CONL_ERROR_MASK | 0x91) /* for interrupt */
-#define E_CO_TIM_DATA (CONL_ERROR_MASK | 0x92) /* for data */
-#define E_CO_TIM_REJ (CONL_ERROR_MASK | 0x93) /* for reject */
+#define E_CO_TIM_DATA (CONL_ERROR_MASK | 0x92) /* for data */
+#define E_CO_TIM_REJ (CONL_ERROR_MASK | 0x93) /* for reject */
#define E_CO_DTE_SPEC (CONL_ERROR_MASK | 0xa0) /* DTE-specific */
#define E_CO_DTE_OK (CONL_ERROR_MASK | 0xa1) /* DTE operational */
#define E_CO_DTE_NOK (CONL_ERROR_MASK | 0xa2) /* DTE not operational */
-#define E_CO_DTE_RSRC (CONL_ERROR_MASK | 0xa3) /* DTE resource constraint*/
+#define E_CO_DTE_RSRC (CONL_ERROR_MASK | 0xa3) /* DTE resource
+ * constraint */
#define E_CO_DTE_FSLCT (CONL_ERROR_MASK | 0xa4) /* fast select not subsc */
#define E_CO_DTE_PFPKT (CONL_ERROR_MASK | 0xa5) /* partially full pkt */
#define E_CO_DTE_DBIT (CONL_ERROR_MASK | 0xa6) /* D-bit proc not supp */
#define E_CO_OSI_REJP (CONL_ERROR_MASK | 0xe4) /* reject permanent */
#define E_CO_OSI_QOST (CONL_ERROR_MASK | 0xe5) /* reject QOS transient */
#define E_CO_OSI_QOSP (CONL_ERROR_MASK | 0xe6) /* reject QOS permanent */
-#define E_CO_OSI_NSAPT (CONL_ERROR_MASK | 0xe7) /* NSAP unreach transient */
-#define E_CO_OSI_NSAPP (CONL_ERROR_MASK | 0xe8) /* NSAP unreach permanent */
+#define E_CO_OSI_NSAPT (CONL_ERROR_MASK | 0xe7) /* NSAP unreach
+ * transient */
+#define E_CO_OSI_NSAPP (CONL_ERROR_MASK | 0xe8) /* NSAP unreach
+ * permanent */
#define E_CO_OSI_RESET (CONL_ERROR_MASK | 0xe9) /* reset no reason */
#define E_CO_OSI_CONGEST (CONL_ERROR_MASK | 0xea) /* reset congestion */
-#define E_CO_OSI_UNSAP (CONL_ERROR_MASK | 0xeb) /* unknown NSAP permanent */
+#define E_CO_OSI_UNSAP (CONL_ERROR_MASK | 0xeb) /* unknown NSAP
+ * permanent */
-#define E_CO_HLI_INIT (CONL_ERROR_MASK | 0xf0) /* higher level initiated*/
+#define E_CO_HLI_INIT (CONL_ERROR_MASK | 0xf0) /* higher level
+ * initiated */
#define E_CO_HLI_DISCN (CONL_ERROR_MASK | 0xf1) /* disconnect normal */
#define E_CO_HLI_DISCA (CONL_ERROR_MASK | 0xf2) /* disconnect abnormal */
-#define E_CO_HLI_DISCI (CONL_ERROR_MASK | 0xf3) /* disconnect incompatible*/
+#define E_CO_HLI_DISCI (CONL_ERROR_MASK | 0xf3) /* disconnect
+ * incompatible */
#define E_CO_HLI_REJT (CONL_ERROR_MASK | 0xf4) /* reject transient */
#define E_CO_HLI_REJP (CONL_ERROR_MASK | 0xf5) /* reject permanent */
#define E_CO_HLI_QOST (CONL_ERROR_MASK | 0xf6) /* reject QOS transient */
#define E_CO_HLI_RESYNC (CONL_ERROR_MASK | 0xfa) /* reset - user resync */
/* Cause on 8208 CLEAR field */
-#define E_CO_NUMBERBUSY (CONL_ERROR_MASK | 0x101) /* Number busy */
-#define E_CO_INVFACREQ (CONL_ERROR_MASK | 0x103) /* invalid facil req */
-#define E_CO_NETCONGEST (CONL_ERROR_MASK | 0x105) /* Network congestion */
-#define E_CO_OUTOFORDER (CONL_ERROR_MASK | 0x109) /* Out of order */
-#define E_CO_ACCESSBAR (CONL_ERROR_MASK | 0x10b) /* access barred */
-#define E_CO_NOTOBTAIN (CONL_ERROR_MASK | 0x10d) /* not obtainable */
-#define E_CO_REMPROCERR (CONL_ERROR_MASK | 0x111) /* Remote procedure err */
-#define E_CO_LOCPROCERR (CONL_ERROR_MASK | 0x113) /* Local procedure err */
-#define E_CO_RPOAOOO (CONL_ERROR_MASK | 0x115) /* RPOA out of order */
-#define E_CO_NOREVCHG (CONL_ERROR_MASK | 0x119) /* Revs chg not accepted*/
-#define E_CO_INCOMPAT (CONL_ERROR_MASK | 0x121) /* Incompatible dest */
-#define E_CO_NOFASTSEL (CONL_ERROR_MASK | 0x129)
- /* Fast select accpt not subscribed */
-#define E_CO_NOSHIP (CONL_ERROR_MASK | 0x139) /* ship absent */
-#define E_CO_GWPROCERR (CONL_ERROR_MASK | 0x1c1) /* Gateway-detected err*/
-#define E_CO_GWCONGEST (CONL_ERROR_MASK | 0x1c3) /* Gateway congestion*/
+#define E_CO_NUMBERBUSY (CONL_ERROR_MASK | 0x101) /* Number busy */
+#define E_CO_INVFACREQ (CONL_ERROR_MASK | 0x103) /* invalid facil req */
+#define E_CO_NETCONGEST (CONL_ERROR_MASK | 0x105) /* Network congestion */
+#define E_CO_OUTOFORDER (CONL_ERROR_MASK | 0x109) /* Out of order */
+#define E_CO_ACCESSBAR (CONL_ERROR_MASK | 0x10b) /* access barred */
+#define E_CO_NOTOBTAIN (CONL_ERROR_MASK | 0x10d) /* not obtainable */
+#define E_CO_REMPROCERR (CONL_ERROR_MASK | 0x111) /* Remote procedure err */
+#define E_CO_LOCPROCERR (CONL_ERROR_MASK | 0x113) /* Local procedure err */
+#define E_CO_RPOAOOO (CONL_ERROR_MASK | 0x115) /* RPOA out of order */
+#define E_CO_NOREVCHG (CONL_ERROR_MASK | 0x119) /* Revs chg not accepted */
+#define E_CO_INCOMPAT (CONL_ERROR_MASK | 0x121) /* Incompatible dest */
+#define E_CO_NOFASTSEL (CONL_ERROR_MASK | 0x129)
+/* Fast select accpt not subscribed */
+#define E_CO_NOSHIP (CONL_ERROR_MASK | 0x139) /* ship absent */
+#define E_CO_GWPROCERR (CONL_ERROR_MASK | 0x1c1) /* Gateway-detected err */
+#define E_CO_GWCONGEST (CONL_ERROR_MASK | 0x1c3) /* Gateway congestion */
/* ARGO only */
-#define E_CO_QFULL (CONL_ERROR_MASK | 0x100) /* dropped packet - queue full*/
-#define E_CO_AIWP (CONL_ERROR_MASK | 0x102) /* addr incompat w/proto */
+#define E_CO_QFULL (CONL_ERROR_MASK | 0x100) /* dropped packet -
+ * queue full */
+#define E_CO_AIWP (CONL_ERROR_MASK | 0x102) /* addr incompat w/proto */
#define E_CO_CHAN (CONL_ERROR_MASK | 0x104) /* bad channel number */
/* ARGO only; driver specific */
#define CONL_ERROR_MAX 0x1c3
-#endif /* _NETISO_ISO_ERRNO_H_ */
+#endif /* _NETISO_ISO_ERRNO_H_ */
-/* $NetBSD: iso_pcb.c,v 1.8 1995/08/17 02:57:33 mycroft Exp $ */
+/* $OpenBSD: iso_pcb.c,v 1.2 1996/03/04 10:35:34 mickey Exp $ */
+/* $NetBSD: iso_pcb.c,v 1.9 1996/02/13 22:10:13 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
#include <netccitt/x25.h>
#include <netccitt/pk.h>
#include <netccitt/pk_var.h>
+#include <netccitt/pk_extern.h>
#endif
#define PCBNULL (struct isopcb *)0
-struct iso_addr zeroiso_addr = {
+struct iso_addr zeroiso_addr = {
0
};
/*
* FUNCTION: iso_pcballoc
*
- * PURPOSE: creates an isopcb structure in an mbuf,
- * with socket (so), and
- * puts it in the queue with head (head)
+ * PURPOSE: creates an isopcb structure in an mbuf,
+ * with socket (so), and
+ * puts it in the queue with head (head)
*
- * RETURNS: 0 if OK, ENOBUFS if can't alloc the necessary mbuf
+ * RETURNS: 0 if OK, ENOBUFS if can't alloc the necessary mbuf
*/
int
-iso_pcballoc(so, head)
- struct socket *so;
- struct isopcb *head;
+iso_pcballoc(so, v)
+ struct socket *so;
+ void *v;
{
+ struct isopcb *head = v;
register struct isopcb *isop;
- IFDEBUG(D_ISO)
- printf("iso_pcballoc(so 0x%x)\n", so);
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ISO]) {
+ printf("iso_pcballoc(so 0x%x)\n", (unsigned int) so);
+ }
+#endif
MALLOC(isop, struct isopcb *, sizeof(*isop), M_PCB, M_NOWAIT);
if (isop == NULL)
return ENOBUFS;
- bzero((caddr_t)isop, sizeof(*isop));
+ bzero(isop, sizeof(*isop));
isop->isop_head = head;
isop->isop_socket = so;
insque(isop, head);
so->so_pcb = isop;
return 0;
}
-
+
/*
* FUNCTION: iso_pcbbind
*
- * PURPOSE: binds the address given in *(nam) to the socket
- * specified by the isopcb in *(isop)
- * If the given address is zero, it makes sure the
- * address isn't already in use and if it's got a network
- * portion, we look for an interface with that network
- * address. If the address given is zero, we allocate
- * a port and stuff it in the (nam) structure.
+ * PURPOSE: binds the address given in *(nam) to the socket
+ * specified by the isopcb in *(isop)
+ * If the given address is zero, it makes sure the
+ * address isn't already in use and if it's got a network
+ * portion, we look for an interface with that network
+ * address. If the address given is zero, we allocate
+ * a port and stuff it in the (nam) structure.
*
- * RETURNS: errno E* or 0 if ok.
+ * RETURNS: errno E* or 0 if ok.
*
* SIDE EFFECTS: increments head->isop_lport if it allocates a port #
*
- * NOTES:
+ * NOTES:
*/
int
-iso_pcbbind(isop, nam)
- register struct isopcb *isop;
- struct mbuf *nam;
+iso_pcbbind(v, nam)
+ register void *v;
+ struct mbuf *nam;
{
+ register struct isopcb *isop = v;
register struct isopcb *head = isop->isop_head;
register struct sockaddr_iso *siso;
struct iso_ifaddr *ia;
union {
- char data[2];
- u_short s;
+ char data[2];
+ u_short s;
} suf;
- IFDEBUG(D_ISO)
- printf("iso_pcbbind(isop 0x%x, nam 0x%x)\n", isop, nam);
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ISO]) {
+ printf("iso_pcbbind(isop 0x%x, nam 0x%x)\n",
+ (unsigned int) isop, (unsigned int) nam);
+ }
+#endif
suf.s = 0;
- if (iso_ifaddr.tqh_first == 0) /* any interfaces attached? */
+ if (iso_ifaddr.tqh_first == 0) /* any interfaces attached? */
return EADDRNOTAVAIL;
- if (isop->isop_laddr) /* already bound */
+ if (isop->isop_laddr) /* already bound */
return EADDRINUSE;
- if(nam == (struct mbuf *)0) {
+ if (nam == (struct mbuf *) 0) {
isop->isop_laddr = &isop->isop_sladdr;
isop->isop_sladdr.siso_len = sizeof(struct sockaddr_iso);
isop->isop_sladdr.siso_family = AF_ISO;
goto noname;
}
siso = mtod(nam, struct sockaddr_iso *);
- IFDEBUG(D_ISO)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ISO]) {
printf("iso_pcbbind(name len 0x%x)\n", nam->m_len);
printf("The address is %s\n", clnp_iso_addrp(&siso->siso_addr));
- ENDDEBUG
+ }
+#endif
/*
* We would like sort of length check but since some OSI addrs
* do not have fixed length, we can't really do much.
* However, in fact the size of the whole thing is a struct
* sockaddr_iso, so probably this is what we should check for.
*/
- if( (nam->m_len < 2) || (nam->m_len < siso->siso_len)) {
- return ENAMETOOLONG;
+ if ((nam->m_len < 2) || (nam->m_len < siso->siso_len)) {
+ return ENAMETOOLONG;
}
if (siso->siso_nlen) {
/* non-zero net addr- better match one of our interfaces */
- IFDEBUG(D_ISO)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ISO]) {
printf("iso_pcbbind: bind to NOT zeroisoaddr\n");
- ENDDEBUG
- for (ia = iso_ifaddr.tqh_first; ia != 0; ia = ia->ia_list.tqe_next)
+ }
+#endif
+ for (ia = iso_ifaddr.tqh_first; ia != 0; ia = ia->ia_list.tqe_next)
if (SAME_ISOADDR(siso, &ia->ia_addr))
break;
if (ia == 0)
return EADDRNOTAVAIL;
- }
- if (siso->siso_len <= sizeof (isop->isop_sladdr)) {
+ }
+ if (siso->siso_len <= sizeof(isop->isop_sladdr)) {
isop->isop_laddr = &isop->isop_sladdr;
} else {
- if ((nam = m_copy(nam, 0, (int)M_COPYALL)) == 0)
+ if ((nam = m_copy(nam, 0, (int) M_COPYALL)) == 0)
return ENOBUFS;
isop->isop_laddr = mtod(nam, struct sockaddr_iso *);
}
- bcopy((caddr_t)siso, (caddr_t)isop->isop_laddr, siso->siso_len);
+ bcopy((caddr_t) siso, (caddr_t) isop->isop_laddr, siso->siso_len);
if (siso->siso_tlen == 0)
goto noname;
if ((isop->isop_socket->so_options & SO_REUSEADDR) == 0 &&
- iso_pcblookup(head, 0, (caddr_t)0, isop->isop_laddr))
+ iso_pcblookup(head, 0, (caddr_t) 0, isop->isop_laddr))
return EADDRINUSE;
if (siso->siso_tlen <= 2) {
bcopy(TSEL(siso), suf.data, sizeof(suf.data));
suf.s = ntohs(suf.s);
- if((suf.s < ISO_PORT_RESERVED) &&
- (isop->isop_socket->so_state && SS_PRIV) == 0)
+ if ((suf.s < ISO_PORT_RESERVED) &&
+ (isop->isop_socket->so_state && SS_PRIV) == 0)
return EACCES;
} else {
- register char *cp;
+ register char *cp;
noname:
cp = TSEL(isop->isop_laddr);
- IFDEBUG(D_ISO)
- printf("iso_pcbbind noname\n");
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ISO]) {
+ printf("iso_pcbbind noname\n");
+ }
+#endif
do {
if (head->isop_lport++ < ISO_PORT_RESERVED ||
head->isop_lport > ISO_PORT_USERRESERVED)
suf.s = htons(head->isop_lport);
cp[0] = suf.data[0];
cp[1] = suf.data[1];
- } while (iso_pcblookup(head, 0, (caddr_t)0, isop->isop_laddr));
+ } while (iso_pcblookup(head, 0, (caddr_t) 0, isop->isop_laddr));
+ }
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ISO]) {
+ printf("iso_pcbbind returns 0, suf 0x%x\n", suf.s);
}
- IFDEBUG(D_ISO)
- printf("iso_pcbbind returns 0, suf 0x%x\n", suf);
- ENDDEBUG
+#endif
return 0;
}
/*
* FUNCTION: iso_pcbconnect
*
- * PURPOSE: Make the isopcb (isop) look like it's connected.
- * In other words, give it the peer address given in
- * the mbuf * (nam). Make sure such a combination
- * of local, peer addresses doesn't already exist
- * for this protocol. Internet mentality prevails here,
- * wherein a src,dst pair uniquely identifies a connection.
- * Both net address and port must be specified in argument
- * (nam).
- * If we don't have a local address for this socket yet,
- * we pick one by calling iso_pcbbind().
+ * PURPOSE: Make the isopcb (isop) look like it's connected.
+ * In other words, give it the peer address given in
+ * the mbuf * (nam). Make sure such a combination
+ * of local, peer addresses doesn't already exist
+ * for this protocol. Internet mentality prevails here,
+ * wherein a src,dst pair uniquely identifies a connection.
+ * Both net address and port must be specified in argument
+ * (nam).
+ * If we don't have a local address for this socket yet,
+ * we pick one by calling iso_pcbbind().
*
- * RETURNS: errno E* or 0 if ok.
+ * RETURNS: errno E* or 0 if ok.
*
* SIDE EFFECTS: Looks up a route, which may cause one to be left
- * in the isopcb.
+ * in the isopcb.
*
- * NOTES:
+ * NOTES:
*/
int
-iso_pcbconnect(isop, nam)
- register struct isopcb *isop;
- struct mbuf *nam;
+iso_pcbconnect(v, nam)
+ void *v;
+ struct mbuf *nam;
{
- register struct sockaddr_iso *siso = mtod(nam, struct sockaddr_iso *);
- int local_zero, error = 0;
- struct iso_ifaddr *ia;
+ register struct isopcb *isop = v;
+ register struct sockaddr_iso *siso = mtod(nam, struct sockaddr_iso *);
+ int local_zero, error = 0;
+ struct iso_ifaddr *ia;
- IFDEBUG(D_ISO)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ISO]) {
printf("iso_pcbconnect(isop 0x%x sock 0x%x nam 0x%x",
- isop, isop->isop_socket, nam);
+ (unsigned int) isop, (unsigned int) isop->isop_socket,
+ (unsigned int) nam);
printf("nam->m_len 0x%x), addr:\n", nam->m_len);
dump_isoaddr(siso);
- ENDDEBUG
+ }
+#endif
if (nam->m_len < siso->siso_len)
- return EINVAL;
+ return EINVAL;
if (siso->siso_family != AF_ISO)
return EAFNOSUPPORT;
if (siso->siso_nlen == 0) {
- if (ia = iso_ifaddr.tqh_first) {
- int nlen = ia->ia_addr.siso_nlen;
+ if ((ia = iso_ifaddr.tqh_first) != NULL) {
+ int nlen = ia->ia_addr.siso_nlen;
ovbcopy(TSEL(siso), nlen + TSEL(siso),
- siso->siso_plen + siso->siso_tlen + siso->siso_slen);
- bcopy((caddr_t)&ia->ia_addr.siso_addr,
- (caddr_t)&siso->siso_addr, nlen + 1);
+ siso->siso_plen + siso->siso_tlen + siso->siso_slen);
+ bcopy((caddr_t) & ia->ia_addr.siso_addr,
+ (caddr_t) & siso->siso_addr, nlen + 1);
/* includes siso->siso_nlen = nlen; */
} else
return EADDRNOTAVAIL;
* particular local interface. So, if we want to send somebody
* we need to choose a return address.
*/
- local_zero =
+ local_zero =
((isop->isop_laddr == 0) || (isop->isop_laddr->siso_nlen == 0));
if (local_zero) {
- int flags;
+ int flags;
- IFDEBUG(D_ISO)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ISO]) {
printf("iso_pcbconnect localzero 1\n");
- ENDDEBUG
- /*
- * If route is known or can be allocated now,
- * our src addr is taken from the i/f, else punt.
+ }
+#endif
+ /*
+ * If route is known or can be allocated now, our src addr is
+ * taken from the i/f, else punt.
*/
flags = isop->isop_socket->so_options & SO_DONTROUTE;
- if (error = clnp_route(&siso->siso_addr, &isop->isop_route, flags,
- (struct sockaddr **)0, &ia))
+ error = clnp_route(&siso->siso_addr, &isop->isop_route, flags,
+ NULL, &ia);
+ if (error)
return error;
- IFDEBUG(D_ISO)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ISO]) {
printf("iso_pcbconnect localzero 2, ro->ro_rt 0x%x",
- isop->isop_route.ro_rt);
- printf(" ia 0x%x\n", ia);
- ENDDEBUG
- }
- IFDEBUG(D_ISO)
- printf("in iso_pcbconnect before lookup isop 0x%x isop->sock 0x%x\n",
- isop, isop->isop_socket);
- ENDDEBUG
+ (unsigned int) isop->isop_route.ro_rt);
+ printf(" ia 0x%x\n", (unsigned int) ia);
+ }
+#endif
+ }
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ISO]) {
+ printf("in iso_pcbconnect before lookup isop 0x%x isop->sock 0x%x\n",
+ (unsigned int) isop, (unsigned int) isop->isop_socket);
+ }
+#endif
if (local_zero) {
- int nlen, tlen, totlen; caddr_t oldtsel, newtsel;
+ int nlen, tlen, totlen;
+ caddr_t oldtsel, newtsel;
siso = isop->isop_laddr;
if (siso == 0 || siso->siso_tlen == 0)
- (void)iso_pcbbind(isop, (struct mbuf *)0);
+ (void) iso_pcbbind(isop, NULL);
/*
* Here we have problem of squezeing in a definite network address
* into an existing sockaddr_iso, which in fact may not have room
nlen = ia->ia_addr.siso_nlen;
totlen = tlen + nlen + _offsetof(struct sockaddr_iso, siso_data[0]);
if ((siso == &isop->isop_sladdr) &&
- (totlen > sizeof(isop->isop_sladdr))) {
- struct mbuf *m = m_get(M_DONTWAIT, MT_SONAME);
+ (totlen > sizeof(isop->isop_sladdr))) {
+ struct mbuf *m = m_get(M_DONTWAIT, MT_SONAME);
if (m == 0)
- return ENOBUFS;
+ return ENOBUFS;
m->m_len = totlen;
isop->isop_laddr = siso = mtod(m, struct sockaddr_iso *);
}
siso->siso_len = totlen;
siso = mtod(nam, struct sockaddr_iso *);
}
- IFDEBUG(D_ISO)
- printf("in iso_pcbconnect before bcopy isop 0x%x isop->sock 0x%x\n",
- isop, isop->isop_socket);
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ISO]) {
+ printf("in iso_pcbconnect before bcopy isop 0x%x isop->sock 0x%x\n",
+ (unsigned int) isop, (unsigned int) isop->isop_socket);
+ }
+#endif
/*
* If we had to allocate space to a previous big foreign address,
* and for some reason we didn't free it, we reuse it knowing
if (siso->siso_len <= sizeof(isop->isop_sfaddr))
isop->isop_faddr = &isop->isop_sfaddr;
else {
- struct mbuf *m = m_get(M_DONTWAIT, MT_SONAME);
+ struct mbuf *m = m_get(M_DONTWAIT, MT_SONAME);
if (m == 0)
return ENOBUFS;
isop->isop_faddr = mtod(m, struct sockaddr_iso *);
}
}
- bcopy((caddr_t)siso, (caddr_t)isop->isop_faddr, siso->siso_len);
- IFDEBUG(D_ISO)
- printf("in iso_pcbconnect after bcopy isop 0x%x isop->sock 0x%x\n",
- isop, isop->isop_socket);
+ bcopy((caddr_t) siso, (caddr_t) isop->isop_faddr, siso->siso_len);
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ISO]) {
+ printf("in iso_pcbconnect after bcopy isop 0x%x isop->sock 0x%x\n",
+ (unsigned int) isop, (unsigned int) isop->isop_socket);
printf("iso_pcbconnect connected to addr:\n");
dump_isoaddr(isop->isop_faddr);
printf("iso_pcbconnect end: src addr:\n");
dump_isoaddr(isop->isop_laddr);
- ENDDEBUG
+ }
+#endif
return 0;
}
/*
* FUNCTION: iso_pcbdisconnect()
*
- * PURPOSE: washes away the peer address info so the socket
- * appears to be disconnected.
- * If there's no file descriptor associated with the socket
- * it detaches the pcb.
+ * PURPOSE: washes away the peer address info so the socket
+ * appears to be disconnected.
+ * If there's no file descriptor associated with the socket
+ * it detaches the pcb.
*
- * RETURNS: Nada.
+ * RETURNS: Nada.
*
* SIDE EFFECTS: May detach the pcb.
*
- * NOTES:
+ * NOTES:
*/
void
-iso_pcbdisconnect(isop)
- struct isopcb *isop;
+iso_pcbdisconnect(v)
+ void *v;
{
- void iso_pcbdetach();
+ struct isopcb *isop = v;
register struct sockaddr_iso *siso;
- IFDEBUG(D_ISO)
- printf("iso_pcbdisconnect(isop 0x%x)\n", isop);
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ISO]) {
+ printf("iso_pcbdisconnect(isop 0x%x)\n", (unsigned int) isop);
+ }
+#endif
/*
* Preserver binding infnormation if already bound.
*/
if ((siso = isop->isop_laddr) && siso->siso_nlen && siso->siso_tlen) {
- caddr_t otsel = TSEL(siso);
+ caddr_t otsel = TSEL(siso);
siso->siso_nlen = 0;
ovbcopy(otsel, TSEL(siso), siso->siso_tlen);
}
/*
* FUNCTION: iso_pcbdetach
*
- * PURPOSE: detach the pcb at *(isop) from it's socket and free
- * the mbufs associated with the pcb..
- * Dequeues (isop) from its head.
+ * PURPOSE: detach the pcb at *(isop) from it's socket and free
+ * the mbufs associated with the pcb..
+ * Dequeues (isop) from its head.
*
- * RETURNS: Nada.
+ * RETURNS: Nada.
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
*/
void
-iso_pcbdetach(isop)
- struct isopcb *isop;
+iso_pcbdetach(v)
+ void *v;
{
- struct socket *so = isop->isop_socket;
+ struct isopcb *isop = v;
+ struct socket *so = isop->isop_socket;
- IFDEBUG(D_ISO)
- printf("iso_pcbdetach(isop 0x%x socket 0x%x so 0x%x)\n",
- isop, isop->isop_socket, so);
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ISO]) {
+ printf("iso_pcbdetach(isop 0x%x socket 0x%x so 0x%x)\n",
+ (unsigned int) isop, (unsigned int) isop->isop_socket,
+ (unsigned int) so);
+ }
+#endif
#ifdef TPCONS
if (isop->isop_chan) {
- register struct pklcd *lcp = (struct pklcd *)isop->isop_chan;
+ register struct pklcd *lcp = (struct pklcd *) isop->isop_chan;
if (--isop->isop_refcnt > 0)
return;
if (lcp && lcp->lcd_state == DATA_TRANSFER) {
isop->isop_chan = 0;
}
#endif
- if (so) { /* in the x.25 domain, we sometimes have no socket */
+ if (so) { /* in the x.25 domain, we sometimes have no
+ * socket */
so->so_pcb = 0;
- sofree(so);
+ sofree(so);
}
- IFDEBUG(D_ISO)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ISO]) {
printf("iso_pcbdetach 2 \n");
- ENDDEBUG
+ }
+#endif
if (isop->isop_options)
- (void)m_free(isop->isop_options);
- IFDEBUG(D_ISO)
+ (void) m_free(isop->isop_options);
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ISO]) {
printf("iso_pcbdetach 3 \n");
- ENDDEBUG
+ }
+#endif
if (isop->isop_route.ro_rt)
rtfree(isop->isop_route.ro_rt);
- IFDEBUG(D_ISO)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ISO]) {
printf("iso_pcbdetach 3.1\n");
- ENDDEBUG
+ }
+#endif
if (isop->isop_clnpcache != NULL) {
struct clnp_cache *clcp =
- mtod(isop->isop_clnpcache, struct clnp_cache *);
- IFDEBUG(D_ISO)
- printf("iso_pcbdetach 3.2: clcp 0x%x freeing clc_hdr x%x\n",
- clcp, clcp->clc_hdr);
- ENDDEBUG
+ mtod(isop->isop_clnpcache, struct clnp_cache *);
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ISO]) {
+ printf("iso_pcbdetach 3.2: clcp 0x%x freeing clc_hdr x%x\n",
+ (unsigned int) clcp,
+ (unsigned int) clcp->clc_hdr);
+ }
+#endif
if (clcp->clc_hdr != NULL)
m_free(clcp->clc_hdr);
- IFDEBUG(D_ISO)
- printf("iso_pcbdetach 3.3: freeing cache x%x\n",
- isop->isop_clnpcache);
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ISO]) {
+ printf("iso_pcbdetach 3.3: freeing cache x%x\n",
+ (unsigned int) isop->isop_clnpcache);
+ }
+#endif
m_free(isop->isop_clnpcache);
}
- IFDEBUG(D_ISO)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ISO]) {
printf("iso_pcbdetach 4 \n");
- ENDDEBUG
+ }
+#endif
remque(isop);
- IFDEBUG(D_ISO)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ISO]) {
printf("iso_pcbdetach 5 \n");
- ENDDEBUG
+ }
+#endif
if (isop->isop_laddr && (isop->isop_laddr != &isop->isop_sladdr))
m_freem(dtom(isop->isop_laddr));
- free((caddr_t)isop, M_PCB);
+ free((caddr_t) isop, M_PCB);
}
/*
* FUNCTION: iso_pcbnotify
*
- * PURPOSE: notify all connections in this protocol's queue (head)
- * that have peer address (dst) of the problem (errno)
- * by calling (notify) on the connections' isopcbs.
+ * PURPOSE: notify all connections in this protocol's queue (head)
+ * that have peer address (dst) of the problem (errno)
+ * by calling (notify) on the connections' isopcbs.
*
- * RETURNS: Rien.
+ * RETURNS: Rien.
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES: (notify) is called at splimp!
+ * NOTES: (notify) is called at splimp!
*/
void
iso_pcbnotify(head, siso, errno, notify)
- struct isopcb *head;
+ struct isopcb *head;
register struct sockaddr_iso *siso;
- int errno, (*notify)();
+ int errno;
+ void (*notify) __P((struct isopcb *));
{
register struct isopcb *isop;
- int s = splimp();
+ int s = splimp();
- IFDEBUG(D_ISO)
- printf("iso_pcbnotify(head 0x%x, notify 0x%x) dst:\n", head, notify);
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ISO]) {
+ printf("iso_pcbnotify(head 0x%x, notify 0x%x) dst:\n",
+ (unsigned int) head, (unsigned int) notify);
+ }
+#endif
for (isop = head->isop_next; isop != head; isop = isop->isop_next) {
if (isop->isop_socket == 0 || isop->isop_faddr == 0 ||
- !SAME_ISOADDR(siso, isop->isop_faddr)) {
- IFDEBUG(D_ISO)
- printf("iso_pcbnotify: CONTINUE isop 0x%x, sock 0x%x\n" ,
- isop, isop->isop_socket);
- printf("addrmatch cmp'd with (0x%x):\n", isop->isop_faddr);
+ !SAME_ISOADDR(siso, isop->isop_faddr)) {
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ISO]) {
+ printf("iso_pcbnotify: CONTINUE isop 0x%x, sock 0x%x\n",
+ (unsigned int) isop,
+ (unsigned int) isop->isop_socket);
+ printf("addrmatch cmp'd with (0x%x):\n",
+ (unsigned int) isop->isop_faddr);
dump_isoaddr(isop->isop_faddr);
- ENDDEBUG
+ }
+#endif
continue;
}
- if (errno)
+ if (errno)
isop->isop_socket->so_error = errno;
if (notify)
- (*notify)(isop);
+ (*notify) (isop);
}
splx(s);
- IFDEBUG(D_ISO)
- printf("END OF iso_pcbnotify\n" );
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ISO]) {
+ printf("END OF iso_pcbnotify\n");
+ }
+#endif
}
/*
* FUNCTION: iso_pcblookup
*
- * PURPOSE: looks for a given combination of (faddr), (fport),
- * (lport), (laddr) in the queue named by (head).
- * Argument (flags) is ignored.
+ * PURPOSE: looks for a given combination of (faddr), (fport),
+ * (lport), (laddr) in the queue named by (head).
+ * Argument (flags) is ignored.
*
- * RETURNS: ptr to the isopcb if it finds a connection matching
- * these arguments, o.w. returns zero.
+ * RETURNS: ptr to the isopcb if it finds a connection matching
+ * these arguments, o.w. returns zero.
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
*/
-struct isopcb *
+struct isopcb *
iso_pcblookup(head, fportlen, fport, laddr)
- struct isopcb *head;
+ struct isopcb *head;
register struct sockaddr_iso *laddr;
- caddr_t fport;
- int fportlen;
+ caddr_t fport;
+ int fportlen;
{
register struct isopcb *isop;
register caddr_t lp = TSEL(laddr);
- unsigned int llen = laddr->siso_tlen;
+ unsigned int llen = laddr->siso_tlen;
- IFDEBUG(D_ISO)
- printf("iso_pcblookup(head 0x%x laddr 0x%x fport 0x%x)\n",
- head, laddr, fport);
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ISO]) {
+ printf("iso_pcblookup(head 0x%x laddr 0x%x fport 0x%x)\n",
+ (unsigned int) head, (unsigned int) laddr,
+ (unsigned int) fport);
+ }
+#endif
for (isop = head->isop_next; isop != head; isop = isop->isop_next) {
if (isop->isop_laddr == 0 || isop->isop_laddr == laddr)
continue;
if (bcmp(lp, TSEL(isop->isop_laddr), llen))
continue;
if (fportlen && isop->isop_faddr &&
- bcmp(fport, TSEL(isop->isop_faddr), (unsigned)fportlen))
+ bcmp(fport, TSEL(isop->isop_faddr), (unsigned) fportlen))
continue;
- /* PHASE2
- * addrmatch1 should be iso_addrmatch(a, b, mask)
- * where mask is taken from isop->isop_laddrmask (new field)
- * isop_lnetmask will also be available in isop
- if (laddr != &zeroiso_addr &&
- !iso_addrmatch1(laddr, &(isop->isop_laddr.siso_addr)))
- continue;
- */
+ /*
+ * PHASE2 addrmatch1 should be iso_addrmatch(a, b, mask)
+ * where mask is taken from isop->isop_laddrmask (new field)
+ * isop_lnetmask will also be available in isop if (laddr !=
+ * &zeroiso_addr && !iso_addrmatch1(laddr,
+ * &(isop->isop_laddr.siso_addr))) continue;
+ */
if (laddr->siso_nlen && (!SAME_ISOADDR(laddr, isop->isop_laddr)))
continue;
return (isop);
}
- return (struct isopcb *)0;
+ return (struct isopcb *) 0;
}
#endif /* ISO */
-/* $NetBSD: iso_pcb.h,v 1.6 1995/03/26 20:35:23 jtc Exp $ */
+/* $OpenBSD: iso_pcb.h,v 1.2 1996/03/04 10:35:36 mickey Exp $ */
+/* $NetBSD: iso_pcb.h,v 1.7 1996/02/13 22:10:18 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
* Common structure pcb for argo protocol implementation.
*/
struct isopcb {
- struct isopcb *isop_next,*isop_prev; /* pointers to other pcb's */
- struct isopcb *isop_head; /* pointer back to chain of pcbs for
- this protocol */
- struct socket *isop_socket; /* back pointer to socket */
- struct sockaddr_iso *isop_laddr;
- struct sockaddr_iso *isop_faddr;
- struct route_iso {
- struct rtentry *ro_rt;
- struct sockaddr_iso ro_dst;
- } isop_route; /* CLNP routing entry */
- struct mbuf *isop_options; /* CLNP options */
- struct mbuf *isop_optindex; /* CLNP options index */
- struct mbuf *isop_clnpcache; /* CLNP cached hdr */
- caddr_t isop_chan; /* actually struct pklcb * */
- u_short isop_refcnt; /* mult TP4 tpcb's -> here */
- u_short isop_lport; /* MISLEADLING work var */
- u_short isop_tuba_cached; /* for tuba address ref cnts */
- int isop_x25crud_len; /* x25 call request ud */
- char isop_x25crud[MAXX25CRUDLEN];
- struct ifaddr *isop_ifa; /* ESIS interface assoc w/sock */
- struct sockaddr_iso isop_sladdr, /* preallocated laddr */
- isop_sfaddr; /* preallocated faddr */
+ struct isopcb *isop_next, *isop_prev; /* pointers to other pcb's */
+ struct isopcb *isop_head; /* pointer back to chain of pcbs for
+ * this protocol */
+ struct socket *isop_socket; /* back pointer to socket */
+ struct sockaddr_iso *isop_laddr;
+ struct sockaddr_iso *isop_faddr;
+ struct route_iso {
+ struct rtentry *ro_rt;
+ struct sockaddr_iso ro_dst;
+ } isop_route; /* CLNP routing entry */
+ struct mbuf *isop_options; /* CLNP options */
+ struct mbuf *isop_optindex; /* CLNP options index */
+ struct mbuf *isop_clnpcache; /* CLNP cached hdr */
+ caddr_t isop_chan; /* actually struct pklcb * */
+ u_short isop_refcnt; /* mult TP4 tpcb's -> here */
+ u_short isop_lport; /* MISLEADLING work var */
+ u_short isop_tuba_cached; /* for tuba address ref cnts */
+ int isop_x25crud_len; /* x25 call request ud */
+ char isop_x25crud[MAXX25CRUDLEN];
+ struct ifaddr *isop_ifa; /* ESIS interface assoc w/sock */
+ struct sockaddr_iso isop_sladdr, /* preallocated laddr */
+ isop_sfaddr; /* preallocated faddr */
};
#ifdef sotorawcb
* and space is allocated to the necessary sockaddrs.
*/
struct rawisopcb {
- struct rawcb risop_rcb; /* common control block prefix */
- int risop_flags; /* flags, e.g. raw sockopts */
- struct isopcb risop_isop; /* space for bound addresses, routes etc.*/
+ struct rawcb risop_rcb; /* common control block prefix */
+ int risop_flags; /* flags, e.g. raw sockopts */
+ struct isopcb risop_isop; /* space for bound addresses, routes
+ * etc. */
};
#endif
#define sotorawisopcb(so) ((struct rawisopcb *)(so)->so_pcb)
#ifdef _KERNEL
-struct isopcb *iso_pcblookup();
+struct socket;
+struct isopcb;
+struct inpcb;
+struct mbuf;
+struct sockaddr_iso;
+
+int iso_pcballoc __P((struct socket *, void *));
+int iso_pcbbind __P((void *, struct mbuf *));
+int iso_pcbconnect __P((void *, struct mbuf *));
+void iso_pcbdisconnect __P((void *));
+void iso_pcbdetach __P((void *));
+void iso_pcbnotify __P((struct isopcb *, struct sockaddr_iso *, int,
+ void (*) (struct isopcb *)));
+struct isopcb *iso_pcblookup __P((struct isopcb *, int, caddr_t,
+ struct sockaddr_iso *));
#endif
-/* $NetBSD: iso_proto.c,v 1.5 1994/06/29 06:39:49 cgd Exp $ */
+/* $OpenBSD: iso_proto.c,v 1.2 1996/03/04 10:35:38 mickey Exp $ */
+/* $NetBSD: iso_proto.c,v 1.6 1996/02/13 22:10:21 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
#include <netiso/iso.h>
-int clnp_output(), rclnp_output(), rclnp_ctloutput();
-int raw_usrreq(), clnp_usrreq();
-void clnp_init(), clnp_slowtimo(), clnp_drain(), rclnp_input();
-
-int tp_ctloutput(), tp_usrreq(), tpcons_input();
-void tp_init(), tp_fasttimo(), tp_slowtimo(), tp_drain(), cons_init();
-void tpclnp_input(), tpclnp_ctlinput();
-
-int esis_usrreq(), idrp_usrreq(), cltp_usrreq(), cltp_output();
-void esis_init(), idrp_init(), cltp_init(), isis_input(), esis_input();
-void idrp_input(), cltp_input(), esis_ctlinput(), cltp_ctlinput();
-
+#include <netiso/clnp.h>
+#include <netiso/tp_param.h>
+#include <netiso/tp_var.h>
+#include <netiso/esis.h>
#ifdef TUBA
-int tuba_usrreq(), tuba_ctloutput(), tuba_tcpinput();
-void tuba_init(), tuba_slowtimo(), tuba_fasttimo();
+#include <netiso/tuba_table.h>
#endif
-
-struct protosw isosw[] = {
-/*
- * We need a datagram entry through which net mgmt programs can get
- * to the iso_control procedure (iso ioctls). Thus, a minimal
- * SOCK_DGRAM interface is provided here.
- * THIS ONE MUST BE FIRST: Kludge city : socket() says if(!proto) call
- * pffindtype, which gets the first entry that matches the type.
- * sigh.
- */
-{ SOCK_DGRAM, &isodomain, ISOPROTO_CLTP, PR_ATOMIC|PR_ADDR,
- 0, cltp_output, 0, 0,
- cltp_usrreq,
- cltp_init, 0, 0, 0
-},
-
-/*
- * A datagram interface for clnp cannot co-exist with TP/CLNP
- * because CLNP has no way to discriminate incoming TP packets from
- * packets coming in for any other higher layer protocol.
- * Old way: set it up so that pffindproto(... dgm, clnp) fails.
- * New way: let pffindproto work (for x.25, thank you) but create
- * a clnp_usrreq() that returns error on PRU_ATTACH.
- */
-{SOCK_DGRAM, &isodomain, ISOPROTO_CLNP, 0,
- 0, clnp_output, 0, 0,
- clnp_usrreq,
- clnp_init, 0, clnp_slowtimo, clnp_drain,
-},
-
-/* raw clnp */
-{ SOCK_RAW, &isodomain, ISOPROTO_RAW, PR_ATOMIC|PR_ADDR,
- rclnp_input, rclnp_output, 0, rclnp_ctloutput,
- clnp_usrreq,
- 0, 0, 0, 0
-},
-
-/* ES-IS protocol */
-{ SOCK_DGRAM, &isodomain, ISOPROTO_ESIS, PR_ATOMIC|PR_ADDR,
- esis_input, 0, esis_ctlinput, 0,
- esis_usrreq,
- esis_init, 0, 0, 0
-},
-
-/* ISOPROTO_INTRAISIS */
-{ SOCK_DGRAM, &isodomain, ISOPROTO_INTRAISIS, PR_ATOMIC|PR_ADDR,
- isis_input, 0, 0, 0,
- esis_usrreq,
- 0, 0, 0, 0
-},
-
-/* ISOPROTO_IDRP */
-{ SOCK_DGRAM, &isodomain, ISOPROTO_IDRP, PR_ATOMIC|PR_ADDR,
- idrp_input, 0, 0, 0,
- idrp_usrreq,
- idrp_init, 0, 0, 0
-},
-
-/* ISOPROTO_TP */
-{ SOCK_SEQPACKET, &isodomain, ISOPROTO_TP, PR_CONNREQUIRED|PR_WANTRCVD,
- tpclnp_input, 0, tpclnp_ctlinput, tp_ctloutput,
- tp_usrreq,
- tp_init, tp_fasttimo, tp_slowtimo, tp_drain,
-},
+#include <netiso/idrp_var.h>
+#include <netiso/iso_pcb.h>
+#include <netiso/cltp_var.h>
+
+struct protosw isosw[] = {
+ /*
+ * We need a datagram entry through which net mgmt programs can get
+ * to the iso_control procedure (iso ioctls). Thus, a minimal
+ * SOCK_DGRAM interface is provided here.
+ * THIS ONE MUST BE FIRST: Kludge city : socket() says if(!proto) call
+ * pffindtype, which gets the first entry that matches the type.
+ * sigh.
+ */
+ {SOCK_DGRAM, &isodomain, ISOPROTO_CLTP, PR_ATOMIC | PR_ADDR,
+ 0, cltp_output, 0, 0,
+ cltp_usrreq,
+ cltp_init, 0, 0, 0
+ },
+
+ /*
+ * A datagram interface for clnp cannot co-exist with TP/CLNP
+ * because CLNP has no way to discriminate incoming TP packets from
+ * packets coming in for any other higher layer protocol.
+ * Old way: set it up so that pffindproto(... dgm, clnp) fails.
+ * New way: let pffindproto work (for x.25, thank you) but create
+ * a clnp_usrreq() that returns error on PRU_ATTACH.
+ */
+ {SOCK_DGRAM, &isodomain, ISOPROTO_CLNP, 0,
+ 0, clnp_output, 0, 0,
+ clnp_usrreq,
+ clnp_init, 0, clnp_slowtimo, clnp_drain,
+ },
+
+ /* raw clnp */
+ {SOCK_RAW, &isodomain, ISOPROTO_RAW, PR_ATOMIC | PR_ADDR,
+ rclnp_input, rclnp_output, 0, rclnp_ctloutput,
+ clnp_usrreq,
+ 0, 0, 0, 0
+ },
+
+ /* ES-IS protocol */
+ {SOCK_DGRAM, &isodomain, ISOPROTO_ESIS, PR_ATOMIC | PR_ADDR,
+ esis_input, 0, esis_ctlinput, 0,
+ esis_usrreq,
+ esis_init, 0, 0, 0
+ },
+
+ /* ISOPROTO_INTRAISIS */
+ {SOCK_DGRAM, &isodomain, ISOPROTO_INTRAISIS, PR_ATOMIC | PR_ADDR,
+ isis_input, 0, 0, 0,
+ esis_usrreq,
+ 0, 0, 0, 0
+ },
+
+ /* ISOPROTO_IDRP */
+ {SOCK_DGRAM, &isodomain, ISOPROTO_IDRP, PR_ATOMIC | PR_ADDR,
+ idrp_input, 0, 0, 0,
+ idrp_usrreq,
+ idrp_init, 0, 0, 0
+ },
+
+ /* ISOPROTO_TP */
+ {SOCK_SEQPACKET, &isodomain, ISOPROTO_TP, PR_CONNREQUIRED | PR_WANTRCVD,
+ tpclnp_input, 0, tpclnp_ctlinput, tp_ctloutput,
+ tp_usrreq,
+ tp_init, tp_fasttimo, tp_slowtimo, tp_drain,
+ },
#ifdef TUBA
-{ SOCK_STREAM, &isodomain, ISOPROTO_TCP, PR_CONNREQUIRED|PR_WANTRCVD,
- tuba_tcpinput, 0, 0, tuba_ctloutput,
- tuba_usrreq,
- tuba_init, tuba_fasttimo, tuba_fasttimo, 0
-},
+ {SOCK_STREAM, &isodomain, ISOPROTO_TCP, PR_CONNREQUIRED | PR_WANTRCVD,
+ tuba_tcpinput, 0, 0, tuba_ctloutput,
+ tuba_usrreq,
+ tuba_init, tuba_fasttimo, tuba_fasttimo, 0
+ },
#endif
#ifdef TPCONS
-/* ISOPROTO_TP */
-{ SOCK_SEQPACKET, &isodomain, ISOPROTO_TP0, PR_CONNREQUIRED|PR_WANTRCVD,
- tpcons_input, 0, 0, tp_ctloutput,
- tp_usrreq,
- cons_init, 0, 0, 0,
-},
+ /* ISOPROTO_TP */
+ {SOCK_SEQPACKET, &isodomain, ISOPROTO_TP0, PR_CONNREQUIRED | PR_WANTRCVD,
+ tpcons_input, 0, 0, tp_ctloutput,
+ tp_usrreq,
+ cons_init, 0, 0, 0,
+ },
#endif
-
};
-struct domain isodomain = {
- AF_ISO, /* family */
- "iso-domain", /* name */
- 0, /* initialize routine */
- 0, /* externalize access rights */
- 0, /* dispose of internalized rights */
- isosw, /* protosw */
- &isosw[sizeof(isosw)/sizeof(isosw[0])], /* NPROTOSW */
- 0, /* next */
+struct domain isodomain = {
+ AF_ISO, /* family */
+ "iso-domain", /* name */
+ 0, /* initialize routine */
+ 0, /* externalize access rights */
+ 0, /* dispose of internalized rights */
+ isosw, /* protosw */
+ &isosw[sizeof(isosw) / sizeof(isosw[0])], /* NPROTOSW */
+ 0, /* next */
rn_inithead, /* rtattach */
- 48, /* rtoffset */
- sizeof(struct sockaddr_iso) /* maxkeylen */
+ 48, /* rtoffset */
+ sizeof(struct sockaddr_iso) /* maxkeylen */
};
-#endif /* ISO */
+#endif /* ISO */
-/* $NetBSD: iso_snpac.c,v 1.10 1995/06/13 08:12:41 mycroft Exp $ */
+/* $OpenBSD: iso_snpac.c,v 1.2 1996/03/04 10:35:39 mickey Exp $ */
+/* $NetBSD: iso_snpac.c,v 1.11 1996/02/13 22:10:25 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
#include <net/if_dl.h>
#include <net/route.h>
+#include <netinet/in.h>
+#include <netinet/if_ether.h>
+
#include <netiso/iso.h>
#include <netiso/iso_var.h>
#include <netiso/iso_snpac.h>
#include <netiso/esis.h>
#include <netiso/argo_debug.h>
-int iso_systype = SNPA_ES; /* default to be an ES */
-extern short esis_holding_time, esis_config_time, esis_esconfig_time;
-extern struct timeval time;
-extern void esis_config();
-extern int hz;
-static void snpac_fixdstandmask();
+int iso_systype = SNPA_ES; /* default to be an ES */
+extern short esis_holding_time, esis_config_time, esis_esconfig_time;
+extern struct timeval time;
+extern int hz;
LIST_HEAD(, llinfo_llc) llinfo_llc;
struct sockaddr_iso blank_siso = {sizeof(blank_siso), AF_ISO};
-extern u_long iso_hashchar();
static struct sockaddr_iso
- dst = {sizeof(dst), AF_ISO},
- gte = {sizeof(dst), AF_ISO},
- src = {sizeof(dst), AF_ISO},
- msk = {sizeof(dst), AF_ISO},
- zmk = {0};
+ dst = {sizeof(dst), AF_ISO},
+ gte = {sizeof(gte), AF_ISO},
+#if 0
+ src = {sizeof(src), AF_ISO},
+#endif
+ msk = {sizeof(msk), AF_ISO},
+ zmk = {0, 0};
+
#define zsi blank_siso
#define zero_isoa zsi.siso_addr
#define zap_isoaddr(a, b) {Bzero(&a.siso_addr, sizeof(*r)); r = b; \
#define zap_linkaddr(a, b, c, i) \
(*a = blank_dl, bcopy(b, a->sdl_data, a->sdl_alen = c), a->sdl_index = i)
+static void snpac_fixdstandmask __P((int));
+
/*
* We only keep track of a single IS at a time.
*/
-struct rtentry *known_is;
+struct rtentry *known_is;
/*
* Addresses taken from NBS agreements, December 1987.
* lan_output() That means that if these multicast addresses change
* the token ring driver must be altered.
*/
-char all_es_snpa[] = { 0x09, 0x00, 0x2b, 0x00, 0x00, 0x04 };
-char all_is_snpa[] = { 0x09, 0x00, 0x2b, 0x00, 0x00, 0x05 };
-char all_l1is_snpa[] = {0x01, 0x80, 0xc2, 0x00, 0x00, 0x14};
-char all_l2is_snpa[] = {0x01, 0x80, 0xc2, 0x00, 0x00, 0x15};
+char all_es_snpa[] = {0x09, 0x00, 0x2b, 0x00, 0x00, 0x04};
+char all_is_snpa[] = {0x09, 0x00, 0x2b, 0x00, 0x00, 0x05};
+char all_l1is_snpa[] = {0x01, 0x80, 0xc2, 0x00, 0x00, 0x14};
+char all_l2is_snpa[] = {0x01, 0x80, 0xc2, 0x00, 0x00, 0x15};
union sockunion {
struct sockaddr_iso siso;
- struct sockaddr_dl sdl;
- struct sockaddr sa;
+ struct sockaddr_dl sdl;
+ struct sockaddr sa;
};
/*
* FUNCTION: llc_rtrequest
*
- * PURPOSE: Manage routing table entries specific to LLC for ISO.
+ * PURPOSE: Manage routing table entries specific to LLC for ISO.
*
- * NOTES: This does a lot of obscure magic;
+ * NOTES: This does a lot of obscure magic;
*/
+void
llc_rtrequest(req, rt, sa)
-int req;
-register struct rtentry *rt;
-struct sockaddr *sa;
+ int req;
+ register struct rtentry *rt;
+ struct sockaddr *sa;
{
- register union sockunion *gate = (union sockunion *)rt->rt_gateway;
- register struct llinfo_llc *lc = (struct llinfo_llc *)rt->rt_llinfo, *lc2;
- struct rtentry *rt2;
- struct ifnet *ifp = rt->rt_ifp;
- int addrlen = ifp->if_addrlen;
-#define LLC_SIZE 3 /* XXXXXX do this right later */
-
- IFDEBUG (D_SNPA)
- printf("llc_rtrequest(%d, %x, %x)\n", req, rt, sa);
- ENDDEBUG
+ register union sockunion *gate = (union sockunion *) rt->rt_gateway;
+ register struct llinfo_llc *lc = (struct llinfo_llc *) rt->rt_llinfo;
+ struct ifnet *ifp = rt->rt_ifp;
+ int addrlen = ifp->if_addrlen;
+#define LLC_SIZE 3 /* XXXXXX do this right later */
+
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_SNPA]) {
+ printf("llc_rtrequest(%d, %x, %x)\n", req,
+ (unsigned int) rt, (unsigned int) sa);
+ }
+#endif
if (rt->rt_flags & RTF_GATEWAY)
return;
- else switch (req) {
- case RTM_ADD:
- /*
- * Case 1: This route may come from a route to iface with mask
- * or from a default route.
- */
- if (rt->rt_flags & RTF_CLONING) {
- iso_setmcasts(ifp, req);
- rt_setgate(rt, rt_key(rt),
- (struct sockaddr *)&blank_dl);
- return;
- }
- if (lc != 0)
- return; /* happens on a route change */
- /* FALLTHROUGH */
- case RTM_RESOLVE:
- /*
- * Case 2: This route may come from cloning, or a manual route
- * add with a LL address.
- */
- if (gate->sdl.sdl_family != AF_LINK) {
- log(LOG_DEBUG, "llc_rtrequest: got non-link non-gateway route\n");
+ else
+ switch (req) {
+ case RTM_ADD:
+ /*
+ * Case 1: This route may come from a route to iface with mask
+ * or from a default route.
+ */
+ if (rt->rt_flags & RTF_CLONING) {
+ iso_setmcasts(ifp, req);
+ rt_setgate(rt, rt_key(rt),
+ (struct sockaddr *) & blank_dl);
+ return;
+ }
+ if (lc != 0)
+ return; /* happens on a route change */
+ /* FALLTHROUGH */
+ case RTM_RESOLVE:
+ /*
+ * Case 2: This route may come from cloning, or a manual route
+ * add with a LL address.
+ */
+ if (gate->sdl.sdl_family != AF_LINK) {
+ log(LOG_DEBUG, "llc_rtrequest: got non-link non-gateway route\n");
+ break;
+ }
+ R_Malloc(lc, struct llinfo_llc *, sizeof(*lc));
+ rt->rt_llinfo = (caddr_t) lc;
+ if (lc == 0) {
+ log(LOG_DEBUG, "llc_rtrequest: malloc failed\n");
+ break;
+ }
+ Bzero(lc, sizeof(*lc));
+ lc->lc_rt = rt;
+ rt->rt_flags |= RTF_LLINFO;
+ LIST_INSERT_HEAD(&llinfo_llc, lc, lc_list);
+ if (gate->sdl.sdl_alen == sizeof(struct esis_req) + addrlen) {
+ gate->sdl.sdl_alen -= sizeof(struct esis_req);
+ bcopy(addrlen + LLADDR(&gate->sdl),
+ (caddr_t) & lc->lc_er, sizeof(lc->lc_er));
+ } else if (gate->sdl.sdl_alen == addrlen)
+ lc->lc_flags = (SNPA_ES | SNPA_VALID | SNPA_PERM);
break;
- }
- R_Malloc(lc, struct llinfo_llc *, sizeof (*lc));
- rt->rt_llinfo = (caddr_t)lc;
- if (lc == 0) {
- log(LOG_DEBUG, "llc_rtrequest: malloc failed\n");
+ case RTM_DELETE:
+ if (rt->rt_flags & RTF_CLONING)
+ iso_setmcasts(ifp, req);
+ if (lc == 0)
+ return;
+ LIST_REMOVE(lc, lc_list);
+ Free(lc);
+ rt->rt_llinfo = 0;
+ rt->rt_flags &= ~RTF_LLINFO;
break;
}
- Bzero(lc, sizeof(*lc));
- lc->lc_rt = rt;
- rt->rt_flags |= RTF_LLINFO;
- LIST_INSERT_HEAD(&llinfo_llc, lc, lc_list);
- if (gate->sdl.sdl_alen == sizeof(struct esis_req) + addrlen) {
- gate->sdl.sdl_alen -= sizeof(struct esis_req);
- bcopy(addrlen + LLADDR(&gate->sdl),
- (caddr_t)&lc->lc_er, sizeof(lc->lc_er));
- } else if (gate->sdl.sdl_alen == addrlen)
- lc->lc_flags = (SNPA_ES | SNPA_VALID | SNPA_PERM);
- break;
- case RTM_DELETE:
- if (rt->rt_flags & RTF_CLONING)
- iso_setmcasts(ifp, req);
- if (lc == 0)
- return;
- LIST_REMOVE(lc, lc_list);
- Free(lc);
- rt->rt_llinfo = 0;
- rt->rt_flags &= ~RTF_LLINFO;
- break;
- }
if (rt->rt_rmx.rmx_mtu == 0) {
- rt->rt_rmx.rmx_mtu = rt->rt_ifp->if_mtu - LLC_SIZE;
+ rt->rt_rmx.rmx_mtu = rt->rt_ifp->if_mtu - LLC_SIZE;
}
}
+
/*
* FUNCTION: iso_setmcasts
*
- * PURPOSE: Enable/Disable ESIS/ISIS multicast reception on interfaces.
+ * PURPOSE: Enable/Disable ESIS/ISIS multicast reception on
+ * interfaces.
*
- * NOTES: This also does a lot of obscure magic;
+ * NOTES: This also does a lot of obscure magic;
*/
+void
iso_setmcasts(ifp, req)
- struct ifnet *ifp;
- int req;
+ struct ifnet *ifp;
+ int req;
{
- static char *addrlist[] =
- { all_es_snpa, all_is_snpa, all_l1is_snpa, all_l2is_snpa, 0};
- struct ifreq ifr;
+ static char *addrlist[] =
+ {all_es_snpa, all_is_snpa, all_l1is_snpa, all_l2is_snpa, 0};
+ struct ifreq ifr;
register caddr_t *cpp;
- int doreset = 0;
+ int doreset = 0;
- bzero((caddr_t)&ifr, sizeof(ifr));
- for (cpp = (caddr_t *)addrlist; *cpp; cpp++) {
- bcopy(*cpp, (caddr_t)ifr.ifr_addr.sa_data, 6);
+ bzero((caddr_t) & ifr, sizeof(ifr));
+ for (cpp = (caddr_t *) addrlist; *cpp; cpp++) {
+ bcopy(*cpp, (caddr_t) ifr.ifr_addr.sa_data, 6);
if (req == RTM_ADD)
- if (ether_addmulti(&ifr, (struct arpcom *)ifp) == ENETRESET)
+ if (ether_addmulti(&ifr, (struct arpcom *) ifp) == ENETRESET)
doreset++;
- else
- if (ether_delmulti(&ifr, (struct arpcom *)ifp) == ENETRESET)
+ else if (ether_delmulti(&ifr, (struct arpcom *) ifp) == ENETRESET)
doreset++;
}
if (doreset) {
if (ifp->if_reset)
- (*ifp->if_reset)(ifp->if_unit);
+ (*ifp->if_reset) (ifp->if_unit);
else
printf("iso_setmcasts: %s%d needs reseting to receive iso mcasts\n",
- ifp->if_name, ifp->if_unit);
+ ifp->if_name, ifp->if_unit);
}
}
+
/*
* FUNCTION: iso_snparesolve
*
- * PURPOSE: Resolve an iso address into snpa address
+ * PURPOSE: Resolve an iso address into snpa address
*
- * RETURNS: 0 if addr is resolved
- * errno if addr is unknown
+ * RETURNS: 0 if addr is resolved
+ * errno if addr is unknown
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES: Now that we have folded the snpa cache into the routing
- * table, we know there is no snpa address known for this
- * destination. If we know of a default IS, then the address
- * of the IS is returned. If no IS is known, then return the
- * multi-cast address for "all ES" for this interface.
+ * NOTES: Now that we have folded the snpa cache into the routing
+ * table, we know there is no snpa address known for this
+ * destination. If we know of a default IS, then the
+ * address of the IS is returned. If no IS is known,
+ * then return the multi-cast address for "all ES" for
+ * this interface.
*
- * NB: the last case described above constitutes the
- * query configuration function 9542, sec 6.5
- * A mechanism is needed to prevent this function from
- * being invoked if the system is an IS.
+ * NB: the last case described above constitutes the
+ * query configuration function 9542, sec 6.5
+ * A mechanism is needed to prevent this function from
+ * being invoked if the system is an IS.
*/
+int
iso_snparesolve(ifp, dest, snpa, snpa_len)
-struct ifnet *ifp; /* outgoing interface */
-struct sockaddr_iso *dest; /* destination */
-caddr_t snpa; /* RESULT: snpa to be used */
-int *snpa_len; /* RESULT: length of snpa */
+ struct ifnet *ifp; /* outgoing interface */
+ struct sockaddr_iso *dest; /* destination */
+ caddr_t snpa; /* RESULT: snpa to be used */
+ int *snpa_len; /* RESULT: length of snpa */
{
- struct llinfo_llc *sc; /* ptr to snpa table entry */
- caddr_t found_snpa;
- int addrlen;
+ struct llinfo_llc *sc; /* ptr to snpa table entry */
+ caddr_t found_snpa;
+ int addrlen;
/*
- * This hack allows us to send esis packets that have the destination snpa
- * addresss embedded in the destination nsap address
+ * This hack allows us to send esis packets that have the destination
+ * snpa addresss embedded in the destination nsap address
*/
if (dest->siso_data[0] == AFI_SNA) {
/*
* This is a subnetwork address. Return it immediately
*/
- IFDEBUG(D_SNPA)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_SNPA]) {
printf("iso_snparesolve: return SN address\n");
- ENDDEBUG
+ }
+#endif
addrlen = dest->siso_nlen - 1; /* subtract size of AFI */
found_snpa = (caddr_t) dest->siso_data + 1;
- /*
- * If we are an IS, we can't do much with the packet;
- * Check if we know about an IS.
- */
+ /*
+ * If we are an IS, we can't do much with the packet; Check
+ * if we know about an IS.
+ */
} else if (iso_systype != SNPA_IS && known_is != 0 &&
- (sc = (struct llinfo_llc *)known_is->rt_llinfo) &&
- (sc->lc_flags & SNPA_VALID)) {
+ (sc = (struct llinfo_llc *) known_is->rt_llinfo) &&
+ (sc->lc_flags & SNPA_VALID)) {
register struct sockaddr_dl *sdl =
- (struct sockaddr_dl *)(known_is->rt_gateway);
+ (struct sockaddr_dl *) (known_is->rt_gateway);
found_snpa = LLADDR(sdl);
addrlen = sdl->sdl_alen;
} else if (ifp->if_flags & IFF_BROADCAST) {
- /*
- * no IS, no match. Return "all es" multicast address for this
- * interface, as per Query Configuration Function (9542 sec 6.5)
+ /*
+ * no IS, no match. Return "all es" multicast address for
+ * this interface, as per Query Configuration Function (9542
+ * sec 6.5)
*
- * Note: there is a potential problem here. If the destination
- * is on the subnet and it does not respond with a ESH, but
- * does send back a TP CC, a connection could be established
- * where we always transmit the CLNP packet to "all es"
+ * Note: there is a potential problem here. If the destination
+ * is on the subnet and it does not respond with a ESH, but
+ * does send back a TP CC, a connection could be established
+ * where we always transmit the CLNP packet to "all es"
*/
addrlen = ifp->if_addrlen;
- found_snpa = (caddr_t)all_es_snpa;
+ found_snpa = (caddr_t) all_es_snpa;
} else
return (ENETUNREACH);
bcopy(found_snpa, snpa, *snpa_len = addrlen);
/*
* FUNCTION: snpac_free
*
- * PURPOSE: free an entry in the iso address map table
+ * PURPOSE: free an entry in the iso address map table
*
- * RETURNS: nothing
+ * RETURNS: nothing
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES: If there is a route entry associated with cache
- * entry, then delete that as well
+ * NOTES: If there is a route entry associated with cache
+ * entry, then delete that as well
*/
+void
snpac_free(lc)
-register struct llinfo_llc *lc; /* entry to free */
+ register struct llinfo_llc *lc; /* entry to free */
{
register struct rtentry *rt = lc->lc_rt;
- register struct iso_addr *r;
if (known_is == rt)
known_is = 0;
if (rt && (rt->rt_flags & RTF_UP) &&
- (rt->rt_flags & (RTF_DYNAMIC | RTF_MODIFIED))) {
- RTFREE(rt);
- rtrequest(RTM_DELETE, rt_key(rt), rt->rt_gateway, rt_mask(rt),
- rt->rt_flags, (struct rtentry **)0);
+ (rt->rt_flags & (RTF_DYNAMIC | RTF_MODIFIED))) {
+ RTFREE(rt);
+ rtrequest(RTM_DELETE, rt_key(rt), rt->rt_gateway, rt_mask(rt),
+ rt->rt_flags, (struct rtentry **) 0);
RTFREE(rt);
}
}
/*
* FUNCTION: snpac_add
*
- * PURPOSE: Add an entry to the snpa cache
+ * PURPOSE: Add an entry to the snpa cache
*
- * RETURNS:
+ * RETURNS:
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES: If entry already exists, then update holding time.
+ * NOTES: If entry already exists, then update holding time.
*/
+int
snpac_add(ifp, nsap, snpa, type, ht, nsellength)
-struct ifnet *ifp; /* interface info is related to */
-struct iso_addr *nsap; /* nsap to add */
-caddr_t snpa; /* translation */
-char type; /* SNPA_IS or SNPA_ES */
-u_short ht; /* holding time (in seconds) */
-int nsellength; /* nsaps may differ only in trailing bytes */
+ struct ifnet *ifp; /* interface info is related to */
+ struct iso_addr *nsap; /* nsap to add */
+ caddr_t snpa; /* translation */
+ char type; /* SNPA_IS or SNPA_ES */
+ u_short ht; /* holding time (in seconds) */
+ int nsellength; /* nsaps may differ only in trailing
+ * bytes */
{
- register struct llinfo_llc *lc;
+ register struct llinfo_llc *lc;
register struct rtentry *rt;
- struct rtentry *mrt = 0;
- register struct iso_addr *r; /* for zap_isoaddr macro */
- int snpalen = min(ifp->if_addrlen, MAX_SNPALEN);
- int new_entry = 0, index = ifp->if_index, iftype = ifp->if_type;
+ struct rtentry *mrt = 0;
+ register struct iso_addr *r; /* for zap_isoaddr macro */
+ int snpalen = min(ifp->if_addrlen, MAX_SNPALEN);
+ int new_entry = 0, index = ifp->if_index, iftype = ifp->if_type;
- IFDEBUG(D_SNPA)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_SNPA]) {
printf("snpac_add(%x, %x, %x, %x, %x, %x)\n",
- ifp, nsap, snpa, type, ht, nsellength);
- ENDDEBUG
+ (unsigned int) ifp,
+ (unsigned int) nsap,
+ (unsigned int) snpa, type, ht, nsellength);
+ }
+#endif
zap_isoaddr(dst, nsap);
rt = rtalloc1(sisotosa(&dst), 0);
- IFDEBUG(D_SNPA)
- printf("snpac_add: rtalloc1 returns %x\n", rt);
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_SNPA]) {
+ printf("snpac_add: rtalloc1 returns %x\n", (unsigned int) rt);
+ }
+#endif
if (rt == 0) {
struct sockaddr *netmask;
- int flags;
- add:
+ int flags;
+add:
if (nsellength) {
- netmask = sisotosa(&msk); flags = RTF_UP;
+ netmask = sisotosa(&msk);
+ flags = RTF_UP;
snpac_fixdstandmask(nsellength);
} else {
- netmask = 0; flags = RTF_UP | RTF_HOST;
+ netmask = 0;
+ flags = RTF_UP | RTF_HOST;
}
new_entry = 1;
zap_linkaddr((>e_dl), snpa, snpalen, index);
gte_dl.sdl_type = iftype;
if (rtrequest(RTM_ADD, sisotosa(&dst), S(gte_dl), netmask,
- flags, &mrt) || mrt == 0)
+ flags, &mrt) || mrt == 0)
return (0);
rt = mrt;
rt->rt_refcnt--;
} else {
- register struct sockaddr_dl *sdl = (struct sockaddr_dl *)rt->rt_gateway;
+ register struct sockaddr_dl *sdl = (struct sockaddr_dl *) rt->rt_gateway;
rt->rt_refcnt--;
if ((rt->rt_flags & RTF_LLINFO) == 0)
goto add;
if (nsellength && (rt->rt_flags & RTF_HOST)) {
if (rt->rt_refcnt == 0) {
rtrequest(RTM_DELETE, sisotosa(&dst),
- (struct sockaddr *)0, (struct sockaddr *)0,
- 0, (struct rtentry **)0);
+ (struct sockaddr *) 0, (struct sockaddr *) 0,
+ 0, (struct rtentry **) 0);
rt = 0;
goto add;
} else {
- static struct iso_addr nsap2; register char *cp;
+ static struct iso_addr nsap2;
+ register char *cp;
nsap2 = *nsap;
cp = nsap2.isoa_genaddr + nsap->isoa_len - nsellength;
- while (cp < (char *)(1 + &nsap2))
+ while (cp < (char *) (1 + &nsap2))
*cp++ = 0;
(void) snpac_add(ifp, &nsap2, snpa, type, ht, nsellength);
}
}
if (sdl->sdl_family != AF_LINK || sdl->sdl_alen == 0) {
- int old_sdl_len = sdl->sdl_len;
+ int old_sdl_len = sdl->sdl_len;
if (old_sdl_len < sizeof(*sdl)) {
log(LOG_DEBUG, "snpac_add: cant make room for lladdr\n");
return (0);
new_entry = 1;
}
}
- if ((lc = (struct llinfo_llc *)rt->rt_llinfo) == 0)
+ if ((lc = (struct llinfo_llc *) rt->rt_llinfo) == 0)
panic("snpac_rtrequest");
rt->rt_rmx.rmx_expire = ht + time.tv_sec;
lc->lc_flags = SNPA_VALID | type;
static void
snpac_fixdstandmask(nsellength)
+ int nsellength;
{
- register char *cp = msk.siso_data, *cplim;
+ register char *cp = msk.siso_data, *cplim;
cplim = cp + (dst.siso_nlen -= nsellength);
- msk.siso_len = cplim - (char *)&msk;
+ msk.siso_len = cplim - (char *) &msk;
msk.siso_nlen = 0;
while (cp < cplim)
*cp++ = -1;
- while (cp < (char *)msk.siso_pad)
+ while (cp < (char *) msk.siso_pad)
*cp++ = 0;
- for (cp = dst.siso_data + dst.siso_nlen; cp < (char *)dst.siso_pad; )
+ for (cp = dst.siso_data + dst.siso_nlen; cp < (char *) dst.siso_pad;)
*cp++ = 0;
}
*
* RETURNS: 0 on success, or unix error code
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
*/
-snpac_ioctl (so, cmd, data)
-struct socket *so;
-u_long cmd; /* ioctl to process */
-caddr_t data; /* data for the cmd */
+int
+snpac_ioctl(so, cmd, data)
+ struct socket *so;
+ u_long cmd; /* ioctl to process */
+ caddr_t data; /* data for the cmd */
{
- register struct systype_req *rq = (struct systype_req *)data;
+ register struct systype_req *rq = (struct systype_req *) data;
- IFDEBUG(D_IOCTL)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_IOCTL]) {
if (cmd == SIOCSSTYPE)
printf("snpac_ioctl: cmd set, type x%x, ht %d, ct %d\n",
- rq->sr_type, rq->sr_holdt, rq->sr_configt);
+ rq->sr_type, rq->sr_holdt, rq->sr_configt);
else
printf("snpac_ioctl: cmd get\n");
- ENDDEBUG
+ }
+#endif
if (cmd == SIOCSSTYPE) {
if ((so->so_state & SS_PRIV) == 0)
return (EPERM);
- if ((rq->sr_type & (SNPA_ES|SNPA_IS)) == (SNPA_ES|SNPA_IS))
- return(EINVAL);
+ if ((rq->sr_type & (SNPA_ES | SNPA_IS)) == (SNPA_ES | SNPA_IS))
+ return (EINVAL);
if (rq->sr_type & SNPA_ES) {
iso_systype = SNPA_ES;
} else if (rq->sr_type & SNPA_IS) {
iso_systype = SNPA_IS;
} else {
- return(EINVAL);
+ return (EINVAL);
}
esis_holding_time = rq->sr_holdt;
esis_config_time = rq->sr_configt;
if (esis_esconfig_time != rq->sr_esconfigt) {
- untimeout(esis_config, (caddr_t)0);
+ untimeout(esis_config, (caddr_t) 0);
esis_esconfig_time = rq->sr_esconfigt;
- esis_config();
+ esis_config(NULL);
}
} else if (cmd == SIOCGSTYPE) {
rq->sr_type = iso_systype;
*
* RETURNS: nothing
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
*/
+void
snpac_logdefis(sc)
-register struct rtentry *sc;
+ register struct rtentry *sc;
{
- register struct iso_addr *r;
- register struct sockaddr_dl *sdl = (struct sockaddr_dl *)sc->rt_gateway;
register struct rtentry *rt;
if (known_is == sc || !(sc->rt_flags & RTF_HOST))
}
known_is = sc;
sc->rt_refcnt++;
- rt = rtalloc1((struct sockaddr *)&zsi, 0);
+ rt = rtalloc1((struct sockaddr *) & zsi, 0);
if (rt == 0)
rtrequest(RTM_ADD, sisotosa(&zsi), rt_key(sc), sisotosa(&zmk),
- RTF_DYNAMIC|RTF_GATEWAY, 0);
+ RTF_DYNAMIC | RTF_GATEWAY, 0);
else {
- if ((rt->rt_flags & RTF_DYNAMIC) &&
+ if ((rt->rt_flags & RTF_DYNAMIC) &&
(rt->rt_flags & RTF_GATEWAY) && rt_mask(rt)->sa_len == 0)
rt_setgate(rt, rt_key(rt), rt_key(sc));
}
/*
* FUNCTION: snpac_age
*
- * PURPOSE: Time out snpac entries
+ * PURPOSE: Time out snpac entries
*
- * RETURNS:
+ * RETURNS:
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES: When encountering an entry for the first time, snpac_age
- * may delete up to SNPAC_AGE too many seconds. Ie.
- * if the entry is added a moment before snpac_age is
- * called, the entry will immediately have SNPAC_AGE
- * seconds taken off the holding time, even though
- * it has only been held a brief moment.
+ * NOTES: When encountering an entry for the first time, snpac_age
+ * may delete up to SNPAC_AGE too many seconds. Ie.
+ * if the entry is added a moment before snpac_age is
+ * called, the entry will immediately have SNPAC_AGE
+ * seconds taken off the holding time, even though
+ * it has only been held a brief moment.
*
- * The proper way to do this is set an expiry timeval
- * equal to current time + holding time. Then snpac_age
- * would time out entries where expiry date is older
- * than the current time.
+ * The proper way to do this is set an expiry timeval
+ * equal to current time + holding time. Then snpac_age
+ * would time out entries where expiry date is older
+ * than the current time.
*/
+/*ARGSUSED*/
void
-snpac_age()
+snpac_age(v)
+ void *v;
{
- register struct llinfo_llc *lc, *nlc;
- register struct rtentry *rt;
+ register struct llinfo_llc *lc, *nlc;
+ register struct rtentry *rt;
- timeout(snpac_age, (caddr_t)0, SNPAC_AGE * hz);
+ timeout(snpac_age, (caddr_t) 0, SNPAC_AGE * hz);
for (lc = llinfo_llc.lh_first; lc != 0; lc = nlc) {
nlc = lc->lc_list.le_next;
/*
* FUNCTION: snpac_ownmulti
*
- * PURPOSE: Determine if the snpa address is a multicast address
- * of the same type as the system.
+ * PURPOSE: Determine if the snpa address is a multicast address
+ * of the same type as the system.
*
- * RETURNS: true or false
+ * RETURNS: true or false
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES: Used by interface drivers when not in eavesdrop mode
- * as interm kludge until
- * real multicast addresses can be configured
+ * NOTES: Used by interface drivers when not in eavesdrop mode
+ * as interm kludge until
+ * real multicast addresses can be configured
*/
+int
snpac_ownmulti(snpa, len)
-caddr_t snpa;
-u_int len;
+ caddr_t snpa;
+ u_int len;
{
return (((iso_systype & SNPA_ES) &&
- (!bcmp(snpa, (caddr_t)all_es_snpa, len))) ||
- ((iso_systype & SNPA_IS) &&
- (!bcmp(snpa, (caddr_t)all_is_snpa, len))));
+ (!bcmp(snpa, (caddr_t) all_es_snpa, len))) ||
+ ((iso_systype & SNPA_IS) &&
+ (!bcmp(snpa, (caddr_t) all_is_snpa, len))));
}
/*
* FUNCTION: snpac_flushifp
*
- * PURPOSE: Flush entries associated with specific ifp
+ * PURPOSE: Flush entries associated with specific ifp
*
- * RETURNS: nothing
+ * RETURNS: nothing
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
*/
+void
snpac_flushifp(ifp)
-struct ifnet *ifp;
+ struct ifnet *ifp;
{
- register struct llinfo_llc *lc;
+ register struct llinfo_llc *lc;
for (lc = llinfo_llc.lh_first; lc != 0; lc = lc->lc_list.le_next) {
if (lc->lc_rt->rt_ifp == ifp && (lc->lc_flags & SNPA_VALID))
/*
* FUNCTION: snpac_rtrequest
*
- * PURPOSE: Make a routing request
+ * PURPOSE: Make a routing request
*
- * RETURNS: nothing
+ * RETURNS: nothing
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES: In the future, this should make a request of a user
- * level routing daemon.
+ * NOTES: In the future, this should make a request of a user
+ * level routing daemon.
*/
+void
snpac_rtrequest(req, host, gateway, netmask, flags, ret_nrt)
-int req;
-struct iso_addr *host;
-struct iso_addr *gateway;
-struct iso_addr *netmask;
-short flags;
-struct rtentry **ret_nrt;
+ int req;
+ struct iso_addr *host;
+ struct iso_addr *gateway;
+ struct iso_addr *netmask;
+ short flags;
+ struct rtentry **ret_nrt;
{
register struct iso_addr *r;
- IFDEBUG(D_SNPA)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_SNPA]) {
printf("snpac_rtrequest: ");
if (req == RTM_ADD)
printf("add");
else if (req == RTM_DELETE)
printf("delete");
- else
+ else
printf("unknown command");
printf(" dst: %s\n", clnp_iso_addrp(host));
printf("\tgateway: %s\n", clnp_iso_addrp(gateway));
- ENDDEBUG
+ }
+#endif
zap_isoaddr(dst, host);
if (netmask) {
zap_isoaddr(msk, netmask);
msk.siso_nlen = 0;
- msk.siso_len = msk.siso_pad - (u_char *)&msk;
+ msk.siso_len = msk.siso_pad - (u_char *) & msk;
}
-
rtrequest(req, sisotosa(&dst), sisotosa(>e),
- (netmask ? sisotosa(&msk) : (struct sockaddr *)0), flags, ret_nrt);
+ (netmask ? sisotosa(&msk) : (struct sockaddr *) 0), flags, ret_nrt);
}
/*
* FUNCTION: snpac_addrt
*
- * PURPOSE: Associate a routing entry with an snpac entry
+ * PURPOSE: Associate a routing entry with an snpac entry
*
- * RETURNS: nothing
+ * RETURNS: nothing
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES: If a cache entry exists for gateway, then
- * make a routing entry (host, gateway) and associate
- * with gateway.
+ * NOTES: If a cache entry exists for gateway, then
+ * make a routing entry (host, gateway) and associate
+ * with gateway.
*
- * If a route already exists and is different, first delete
- * it.
+ * If a route already exists and is different, first delete
+ * it.
*
- * This could be made more efficient by checking
- * the existing route before adding a new one.
+ * This could be made more efficient by checking
+ * the existing route before adding a new one.
*/
+void
snpac_addrt(ifp, host, gateway, netmask)
-struct ifnet *ifp;
-struct iso_addr *host, *gateway, *netmask;
+ struct ifnet *ifp;
+ struct iso_addr *host, *gateway, *netmask;
{
register struct iso_addr *r;
if (netmask) {
zap_isoaddr(msk, netmask);
msk.siso_nlen = 0;
- msk.siso_len = msk.siso_pad - (u_char *)&msk;
+ msk.siso_len = msk.siso_pad - (u_char *) & msk;
rtredirect(sisotosa(&dst), sisotosa(>e), sisotosa(&msk),
- RTF_DONE, sisotosa(>e), 0);
+ RTF_DONE, sisotosa(>e), 0);
} else
- rtredirect(sisotosa(&dst), sisotosa(>e), (struct sockaddr *)0,
- RTF_DONE | RTF_HOST, sisotosa(>e), 0);
+ rtredirect(sisotosa(&dst), sisotosa(>e), (struct sockaddr *) 0,
+ RTF_DONE | RTF_HOST, sisotosa(>e), 0);
}
-#endif /* ISO */
+#endif /* ISO */
-/* $NetBSD: iso_snpac.h,v 1.8 1995/06/13 08:12:46 mycroft Exp $ */
+/* $OpenBSD: iso_snpac.h,v 1.2 1996/03/04 10:35:42 mickey Exp $ */
+/* $NetBSD: iso_snpac.h,v 1.9 1996/02/13 22:10:29 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
* ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison
*/
-#define MAX_SNPALEN 8 /* curiously equal to sizeof x.121 (
- plus 1 for nibble len) addr */
+#define MAX_SNPALEN 8 /* curiously equal to sizeof x.121 (
+ * plus 1 for nibble len) addr */
struct snpa_req {
- struct iso_addr sr_isoa; /* nsap address */
- u_char sr_len; /* length of snpa */
- u_char sr_snpa[MAX_SNPALEN]; /* snpa associated
- with nsap address */
- u_char sr_flags; /* true if entry is valid */
- u_short sr_ht; /* holding time */
+ struct iso_addr sr_isoa;/* nsap address */
+ u_char sr_len; /* length of snpa */
+ u_char sr_snpa[MAX_SNPALEN]; /* snpa associated with nsap
+ * address */
+ u_char sr_flags; /* true if entry is valid */
+ u_short sr_ht; /* holding time */
};
#define SNPA_VALID 0x01
#define SNPA_PERM 0x10
struct systype_req {
- short sr_holdt; /* holding timer */
- short sr_configt; /* configuration timer */
- short sr_esconfigt; /* suggested ES configuration timer */
- char sr_type; /* SNPA_ES or SNPA_IS */
+ short sr_holdt; /* holding timer */
+ short sr_configt; /* configuration timer */
+ short sr_esconfigt; /* suggested ES configuration timer */
+ char sr_type;/* SNPA_ES or SNPA_IS */
};
struct esis_req {
- short er_ht; /* holding time */
- u_char er_flags; /* type and validity */
+ short er_ht; /* holding time */
+ u_char er_flags; /* type and validity */
};
/*
* Space for this structure gets added onto the end of a route
struct llinfo_llc {
LIST_ENTRY(llinfo_llc) lc_list;
- struct rtentry *lc_rt; /* backpointer to route */
- struct esis_req lc_er; /* holding time, etc */
+ struct rtentry *lc_rt; /* backpointer to route */
+ struct esis_req lc_er; /* holding time, etc */
#define lc_ht lc_er.er_ht
#define lc_flags lc_er.er_flags
};
/* ISO arp IOCTL data structures */
-#define SIOCSSTYPE _IOW('a', 39, struct systype_req) /* set system type */
-#define SIOCGSTYPE _IOR('a', 40, struct systype_req) /* get system type */
+#define SIOCSSTYPE _IOW('a', 39, struct systype_req) /* set system type */
+#define SIOCGSTYPE _IOR('a', 40, struct systype_req) /* get system type */
-/* $NetBSD: iso_var.h,v 1.7 1995/06/13 07:13:35 mycroft Exp $ */
+/* $OpenBSD: iso_var.h,v 1.2 1996/03/04 10:35:43 mickey Exp $ */
+/* $NetBSD: iso_var.h,v 1.8 1996/02/13 22:10:32 christos Exp $ */
/*-
* Copyright (c) 1988, 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
SOFTWARE.
******************************************************************/
-
+#ifndef _NETISO_ISO_VAR_H_
+#define _NETISO_ISO_VAR_H_
/*
* ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison
*/
/*
- * Interface address, iso version. One of these structures is
+ * Interface address, iso version. One of these structures is
* allocated for each interface with an osi address. The ifaddr
* structure conatins the protocol-independent part
* of the structure, and is assumed to be first.
*/
struct iso_ifaddr {
- struct ifaddr ia_ifa; /* protocol-independent info */
+ struct ifaddr ia_ifa; /* protocol-independent info */
#define ia_ifp ia_ifa.ifa_ifp
#define ia_flags ia_ifa.ifa_flags
- int ia_snpaoffset;
- TAILQ_ENTRY(iso_ifaddr) ia_list; /* list of iso addresses */
- struct sockaddr_iso ia_addr; /* reserve space for interface name */
- struct sockaddr_iso ia_dstaddr; /* reserve space for broadcast addr */
+ int ia_snpaoffset;
+ TAILQ_ENTRY(iso_ifaddr) ia_list; /* list of iso addresses */
+ struct sockaddr_iso ia_addr; /* reserve space for interface name */
+ struct sockaddr_iso ia_dstaddr; /* reserve space for broadcast addr */
#define ia_broadaddr ia_dstaddr
- struct sockaddr_iso ia_sockmask; /* reserve space for general netmask */
+ struct sockaddr_iso ia_sockmask; /* reserve space for general
+ * netmask */
};
-struct iso_aliasreq {
- char ifra_name[IFNAMSIZ]; /* if name, e.g. "en0" */
- struct sockaddr_iso ifra_addr;
- struct sockaddr_iso ifra_dstaddr;
- struct sockaddr_iso ifra_mask;
- int ifra_snpaoffset;
+struct iso_aliasreq {
+ char ifra_name[IFNAMSIZ]; /* if name, e.g. "en0" */
+ struct sockaddr_iso ifra_addr;
+ struct sockaddr_iso ifra_dstaddr;
+ struct sockaddr_iso ifra_mask;
+ int ifra_snpaoffset;
};
-struct iso_ifreq {
- char ifr_name[IFNAMSIZ]; /* if name, e.g. "en0" */
- struct sockaddr_iso ifr_Addr;
+struct iso_ifreq {
+ char ifr_name[IFNAMSIZ]; /* if name, e.g. "en0" */
+ struct sockaddr_iso ifr_Addr;
};
/*
#define IA_SIS(ia) (&(((struct iso_ifaddr *)(ia))->ia_addr))
#define SIOCDIFADDR_ISO _IOW('i',25, struct iso_ifreq) /* delete IF addr */
-#define SIOCAIFADDR_ISO _IOW('i',26, struct iso_aliasreq)/* add/chg IFalias */
+#define SIOCAIFADDR_ISO _IOW('i',26, struct iso_aliasreq) /* add/chg IFalias */
#define SIOCGIFADDR_ISO _IOWR('i',33, struct iso_ifreq) /* get ifnet address */
-#define SIOCGIFDSTADDR_ISO _IOWR('i',34, struct iso_ifreq) /* get dst address */
-#define SIOCGIFNETMASK_ISO _IOWR('i',37, struct iso_ifreq) /* get dst address */
+#define SIOCGIFDSTADDR_ISO _IOWR('i',34, struct iso_ifreq) /* get dst address */
+#define SIOCGIFNETMASK_ISO _IOWR('i',37, struct iso_ifreq) /* get dst address */
/*
* This stuff should go in if.h or if_llc.h or someplace else,
*/
struct llc_etherhdr {
- char dst[6];
- char src[6];
- char len[2];
- char llc_dsap;
- char llc_ssap;
- char llc_ui_byte;
+ char dst[6];
+ char src[6];
+ char len[2];
+ char llc_dsap;
+ char llc_ssap;
+ char llc_ui_byte;
};
struct snpa_hdr {
- struct ifnet *snh_ifp;
- char snh_dhost[6];
- char snh_shost[6];
- short snh_flags;
+ struct ifnet *snh_ifp;
+ char snh_dhost[6];
+ char snh_shost[6];
+ short snh_flags;
};
#ifdef _KERNEL
TAILQ_HEAD(iso_ifaddrhead, iso_ifaddr);
-struct iso_ifaddrhead iso_ifaddr; /* linked list of iso address ifaces */
-struct iso_ifaddr *iso_localifa(); /* linked list of iso address ifaces */
-struct ifqueue clnlintrq; /* clnl packet input queue */
+struct iso_ifaddrhead iso_ifaddr; /* linked list of iso address ifaces */
+struct ifqueue clnlintrq; /* clnl packet input queue */
+struct afhash;
+struct llinfo_llc;
+
+/* iso.c */
+int iso_addrmatch1 __P((struct iso_addr *, struct iso_addr *));
+int iso_addrmatch __P((struct sockaddr_iso *, struct sockaddr_iso *));
+int iso_netmatch __P((struct sockaddr_iso *, struct sockaddr_iso *));
+u_long iso_hashchar __P((caddr_t, int));
+int iso_hash __P((struct sockaddr_iso *, struct afhash *));
+int iso_netof __P((struct iso_addr *, caddr_t));
+int iso_control __P((struct socket *, u_long, caddr_t, struct ifnet *));
+void iso_ifscrub __P((struct ifnet *, struct iso_ifaddr *));
+int iso_ifinit __P((struct ifnet *, struct iso_ifaddr *, struct sockaddr_iso *,
+ int ));
+struct ifaddr *iso_ifwithidi __P((struct sockaddr *));
+int iso_ck_addr __P((struct iso_addr *));
+int iso_eqtype __P((struct iso_addr *, struct iso_addr *));
+struct iso_ifaddr *iso_localifa __P((struct sockaddr_iso *));
+int iso_nlctloutput __P((int, int, caddr_t, struct mbuf *));
+void dump_isoaddr __P((struct sockaddr_iso *));
+
+/* iso_chksum.c */
+int iso_check_csum __P((struct mbuf *, int));
+void iso_gen_csum __P((struct mbuf *, int, int));
+int m_datalen __P((struct mbuf *));
+int m_compress __P((struct mbuf *, struct mbuf **));
+
+/* iso_snpac.c */
+void llc_rtrequest __P((int, struct rtentry *, struct sockaddr *));
+void iso_setmcasts __P((struct ifnet *, int));
+int iso_snparesolve __P((struct ifnet *, struct sockaddr_iso *,
+ caddr_t, int *));
+void snpac_free __P((struct llinfo_llc *));
+int snpac_add __P((struct ifnet *, struct iso_addr *, caddr_t, int,
+ u_short, int));
+int snpac_ioctl __P((struct socket *, u_long, caddr_t));
+void snpac_logdefis __P((struct rtentry *));
+void snpac_age __P((void *));
+int snpac_ownmulti __P((caddr_t, u_int));
+void snpac_flushifp __P((struct ifnet *));
+void snpac_rtrequest __P((int, struct iso_addr *, struct iso_addr *,
+ struct iso_addr *, int, struct rtentry **));
+void snpac_addrt __P((struct ifnet *, struct iso_addr *, struct iso_addr *,
+ struct iso_addr *));
#endif /* _KERNEL */
+#endif /* _NETISO_ISO_VAR_H_ */
+/* $OpenBSD: tp.trans,v 1.2 1996/03/04 10:35:46 mickey Exp $ */
/* $NetBSD: tp.trans,v 1.4 1994/06/29 06:39:55 cgd Exp $ */
/* NEW */
-/* $NetBSD: tp_astring.c,v 1.2 1994/06/29 06:39:57 cgd Exp $ */
+/* $OpenBSD: tp_astring.c,v 1.2 1996/03/04 10:35:48 mickey Exp $ */
+/* $NetBSD: tp_astring.c,v 1.3 1996/02/13 22:10:37 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
* @(#)tp_astring.c 8.1 (Berkeley) 6/10/93
*/
-char *tp_sstring[] = {
-"ST_ERROR(0x0)",
-"TP_CLOSED(0x1)",
-"TP_CRSENT(0x2)",
-"TP_AKWAIT(0x3)",
-"TP_OPEN(0x4)",
-"TP_CLOSING(0x5)",
-"TP_REFWAIT(0x6)",
-"TP_LISTENING(0x7)",
-"TP_CONFIRMING(0x8)",
+char *tp_sstring[] = {
+ "ST_ERROR(0x0)",
+ "TP_CLOSED(0x1)",
+ "TP_CRSENT(0x2)",
+ "TP_AKWAIT(0x3)",
+ "TP_OPEN(0x4)",
+ "TP_CLOSING(0x5)",
+ "TP_REFWAIT(0x6)",
+ "TP_LISTENING(0x7)",
+ "TP_CONFIRMING(0x8)",
};
-char *tp_estring[] = {
-"TM_inact(0x0)",
-"TM_retrans(0x1)",
-"TM_sendack(0x2)",
-"TM_notused(0x3)",
-"TM_reference(0x4)",
-"TM_data_retrans(0x5)",
-"ER_TPDU(0x6)",
-"CR_TPDU(0x7)",
-"DR_TPDU(0x8)",
-"DC_TPDU(0x9)",
-"CC_TPDU(0xa)",
-"AK_TPDU(0xb)",
-"DT_TPDU(0xc)",
-"XPD_TPDU(0xd)",
-"XAK_TPDU(0xe)",
-"T_CONN_req(0xf)",
-"T_DISC_req(0x10)",
-"T_LISTEN_req(0x11)",
-"T_DATA_req(0x12)",
-"T_XPD_req(0x13)",
-"T_USR_rcvd(0x14)",
-"T_USR_Xrcvd(0x15)",
-"T_DETACH(0x16)",
-"T_NETRESET(0x17)",
-"T_ACPT_req(0x18)",
+char *tp_estring[] = {
+ "TM_inact(0x0)",
+ "TM_retrans(0x1)",
+ "TM_sendack(0x2)",
+ "TM_notused(0x3)",
+ "TM_reference(0x4)",
+ "TM_data_retrans(0x5)",
+ "ER_TPDU(0x6)",
+ "CR_TPDU(0x7)",
+ "DR_TPDU(0x8)",
+ "DC_TPDU(0x9)",
+ "CC_TPDU(0xa)",
+ "AK_TPDU(0xb)",
+ "DT_TPDU(0xc)",
+ "XPD_TPDU(0xd)",
+ "XAK_TPDU(0xe)",
+ "T_CONN_req(0xf)",
+ "T_DISC_req(0x10)",
+ "T_LISTEN_req(0x11)",
+ "T_DATA_req(0x12)",
+ "T_XPD_req(0x13)",
+ "T_USR_rcvd(0x14)",
+ "T_USR_Xrcvd(0x15)",
+ "T_DETACH(0x16)",
+ "T_NETRESET(0x17)",
+ "T_ACPT_req(0x18)",
};
-/* $NetBSD: tp_clnp.h,v 1.5 1994/06/29 06:39:58 cgd Exp $ */
+/* $OpenBSD: tp_clnp.h,v 1.2 1996/03/04 10:35:50 mickey Exp $ */
+/* $NetBSD: tp_clnp.h,v 1.6 1996/02/13 22:10:42 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
/*
* ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison
*/
-/*
+/*
* AF_ISO net-dependent structures and include files
*/
#ifndef SOCK_STREAM
#include <sys/socket.h>
-#endif /* SOCK_STREAM */
+#endif /* SOCK_STREAM */
#ifndef RTFREE
#include <net/route.h>
#endif
#include <netiso/iso_var.h>
-struct isopcb tp_isopcb;
- /* queue of active inpcbs for tp ; for tp with dod ip */
+struct isopcb tp_isopcb;
+/* queue of active inpcbs for tp ; for tp with dod ip */
-#endif /* _NETISO_TP_CLNP_H_ */
+#endif /* _NETISO_TP_CLNP_H_ */
-/* $NetBSD: tp_cons.c,v 1.6 1994/06/29 06:39:59 cgd Exp $ */
+/* $OpenBSD: tp_cons.c,v 1.2 1996/03/04 10:35:51 mickey Exp $ */
+/* $NetBSD: tp_cons.c,v 1.8 1996/02/14 21:32:37 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
/*
* ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison
*/
-/*
- * Here is where you find the iso- and cons-dependent code. We've tried
- * keep all net-level and (primarily) address-family-dependent stuff
- * out of the tp source, and everthing here is reached indirectly
- * through a switch table (struct nl_protosw *) tpcb->tp_nlproto
- * (see tp_pcb.c).
- * The routines here are:
- * tpcons_input: pullup and call tp_input w/ correct arguments
- * tpcons_output: package a pkt for cons given an isopcb & some data
- * cons_chan_to_tpcb: find a tpcb based on the channel #
+/*
+ * Here is where you find the iso- and cons-dependent code. We've tried keep
+ * all net-level and (primarily) address-family-dependent stuff out of the tp
+ * source, and everthing here is reached indirectly through a switch table
+ * (struct nl_protosw *) tpcb->tp_nlproto (see tp_pcb.c). The routines here
+ * are: tpcons_input: pullup and call tp_input w/ correct arguments
+ * tpcons_output: package a pkt for cons given an isopcb & some data
+ * cons_chan_to_tpcb: find a tpcb based on the channel #
*/
#ifdef ISO
#ifdef TPCONS
#include <sys/param.h>
+#include <sys/systm.h>
#include <sys/socket.h>
#include <sys/domain.h>
#include <sys/mbuf.h>
#include <netiso/iso.h>
#include <netiso/iso_errno.h>
#include <netiso/iso_pcb.h>
+#include <netiso/iso_var.h>
#include <netiso/cons.h>
#include <netiso/tp_seq.h>
+#include <netiso/tp_var.h>
+#include <netiso/clnp.h>
#undef FALSE
#undef TRUE
#include <netccitt/x25.h>
#include <netccitt/pk.h>
#include <netccitt/pk_var.h>
+#include <netccitt/pk_extern.h>
+
+#include <machine/stdarg.h>
#include <netiso/if_cons.c>
-int tpcons_output();
+
/*
* CALLED FROM:
* version of the previous procedure for X.25
*/
-tpcons_pcbconnect(isop, nam)
-struct isopcb *isop;
-register struct mbuf *nam;
+int
+tpcons_pcbconnect(v, nam)
+ void *v;
+ register struct mbuf *nam;
{
- int error;
- if (error = iso_pcbconnect(isop, nam))
+ struct isopcb *isop = v;
+ int error;
+ if ((error = iso_pcbconnect(isop, nam)) != 0)
return error;
- if ((isop->isop_chan = (caddr_t) pk_attach((struct socket *)0)) == 0) {
- IFDEBUG(D_CCONS)
+ if ((isop->isop_chan = (caddr_t) pk_attach((struct socket *) 0)) == 0) {
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CCONS]) {
printf("tpcons_pcbconnect: no pklcd; returns 0x%x\n", error);
- ENDDEBUG
+ }
+#endif
return ENOBUFS;
}
- if (error = cons_connect(isop)) { /* if it doesn't work */
+ if ((error = cons_connect(isop)) != 0) { /* if it doesn't work */
/* oh, dear, throw packet away */
- pk_disconnect((struct pklcd *)isop->isop_chan);
+ pk_disconnect((struct pklcd *) isop->isop_chan);
isop->isop_chan = 0;
- } else
+ } else
isop->isop_refcnt = 1;
return error;
}
* FUNCTION and ARGUMENTS:
* THIS MAYBE BELONGS IN SOME OTHER PLACE??? but i think not -
*/
-void
-tpcons_ctlinput(cmd, siso, isop)
- int cmd;
- struct sockaddr_iso *siso;
- struct isopcb *isop;
+void *
+tpcons_ctlinput(cmd, siso, v)
+ int cmd;
+ struct sockaddr *siso;
+ void *v;
{
+ struct isopcb *isop = v;
register struct tp_pcb *tpcb = 0;
if (isop->isop_socket)
- tpcb = (struct tp_pcb *)isop->isop_socket->so_pcb;
+ tpcb = (struct tp_pcb *) isop->isop_socket->so_pcb;
switch (cmd) {
case PRC_CONS_SEND_DONE:
if (tpcb) {
- struct tp_event E;
- int error = 0;
+ struct tp_event E;
+ int error = 0;
if (tpcb->tp_class == TP_CLASS_0) {
- /* only if class is exactly class zero, not
+ /*
+ * only if class is exactly class zero, not
* still in class negotiation
*/
/* fake an ack */
- register SeqNum seq = SEQ_ADD(tpcb, tpcb->tp_snduna, 1);
-
- IFTRACE(D_DATA)
- tptrace(TPPTmisc, "FAKE ACK seq cdt 1",
- seq, 0,0,0);
- ENDTRACE
- IFDEBUG(D_DATA)
- printf("FAKE ACK seq 0x%x cdt 1\n", seq );
- ENDDEBUG
- E.ATTR(AK_TPDU).e_cdt = 1;
- E.ATTR(AK_TPDU).e_seq = seq;
- E.ATTR(AK_TPDU).e_subseq = 0;
- E.ATTR(AK_TPDU).e_fcc_present = 0;
- error = DoEvent(AK_TPDU);
- if( error ) {
+ register SeqNum seq = SEQ_ADD(tpcb, tpcb->tp_snduna, 1);
+
+#ifdef TPPT
+ if(tp_traceflags[D_DATA])
+ tptrace(TPPTmisc, "FAKE ACK seq cdt 1",
+ seq, 0, 0, 0);
+#endif
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_DATA]) {
+ printf("FAKE ACK seq 0x%x cdt 1\n", seq);
+ }
+#endif
+ E.TP_ATTR(AK_TPDU).e_cdt = 1;
+ E.TP_ATTR(AK_TPDU).e_seq = seq;
+ E.TP_ATTR(AK_TPDU).e_subseq = 0;
+ E.TP_ATTR(AK_TPDU).e_fcc_present = 0;
+ error = DoEvent(AK_TPDU);
+ if (error) {
tpcb->tp_sock->so_error = error;
}
- } /* else ignore it */
+ } /* else ignore it */
}
break;
case PRC_ROUTEDEAD:
if (tpcb && tpcb->tp_class == TP_CLASS_0) {
tpiso_reset(isop);
break;
- } /* else drop through */
+ } /* else drop through */
default:
- tpclnp_ctlinput(cmd, siso);
+ tpclnp_ctlinput(cmd, siso, NULL);
break;
}
+ return NULL;
}
/*
* cons's intr routine
* FUNCTION and ARGUMENTS:
* Take a packet (m) from cons, pullup m as required by tp,
- * ignore the socket argument, and call tp_input.
- * No return value.
+ * ignore the socket argument, and call tp_input.
+ * No return value.
*/
void
-tpcons_input(m, faddr, laddr, channel)
- struct mbuf *m;
- struct sockaddr_iso *faddr, *laddr;
- caddr_t channel;
+#if __STDC__
+tpcons_input(struct mbuf *m, ...)
+#else
+tpcons_input(m, va_alist)
+ struct mbuf *m;
+ va_dcl
+#endif
{
- if( m == MNULL)
+ struct sockaddr *faddr, *laddr;
+ caddr_t channel;
+ va_list ap;
+ if (m == NULL)
return;
+ va_start(ap, m);
+ faddr = va_arg(ap, struct sockaddr *);
+ laddr = va_arg(ap, struct sockaddr *);
+ channel = va_arg(ap, caddr_t);
+
- m = (struct mbuf *)tp_inputprep(m);
+ m = (struct mbuf *) tp_inputprep(m);
- IFDEBUG(D_TPINPUT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
printf("tpcons_input before tp_input(m 0x%x)\n", m);
- dump_buf( m, 12+ m->m_len);
- ENDDEBUG
+ dump_buf(m, 12 + m->m_len);
+ }
+#endif
tp_input(m, faddr, laddr, channel, tpcons_output, 0);
}
*/
int
-tpcons_output(isop, m0, datalen, nochksum)
- struct isopcb *isop;
- struct mbuf *m0;
- int datalen;
- int nochksum;
+#if __STDC__
+tpcons_output(struct mbuf *m0, ...)
+#else
+tpcons_output(m0, va_alist)
+ struct mbuf *m0;
+ va_dcl
+#endif
{
- register struct mbuf *m = m0;
- int error;
+ struct isopcb *isop;
+ int datalen;
+ int nochksum;
+ register struct mbuf *m = m0;
+ int error;
+ va_list ap;
+
+ va_start(ap, m0);
+ datalen = va_arg(ap, int);
+ isop = va_arg(ap, struct isopcb *);
+ nochksum = va_arg(ap, int);
+ va_end(ap);
- IFDEBUG(D_EMIT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_EMIT]) {
printf(
- "tpcons_output(isop 0x%x, m 0x%x, len 0x%x socket 0x%x\n",
- isop, m0, datalen, isop->isop_socket);
- ENDDEBUG
- if (m == MNULL)
+ "tpcons_output(isop 0x%x, m 0x%x, len 0x%x socket 0x%x\n",
+ isop, m0, datalen, isop->isop_socket);
+ }
+#endif
+ if (m == NULL)
return 0;
if ((m->m_flags & M_PKTHDR) == 0) {
MGETHDR(m, M_DONTWAIT, MT_DATA);
m->m_pkthdr.len = datalen;
if (isop->isop_chan == 0) {
/* got a restart maybe? */
- if ((isop->isop_chan = (caddr_t) pk_attach((struct socket *)0)) == 0) {
- IFDEBUG(D_CCONS)
+ if ((isop->isop_chan = (caddr_t) pk_attach((struct socket *) 0)) == 0) {
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CCONS]) {
printf("tpcons_output: no pklcd\n");
- ENDDEBUG
+ }
+#endif
error = ENOBUFS;
}
- if (error = cons_connect(isop)) {
- pk_disconnect((struct pklcd *)isop->isop_chan);
+ if ((error = cons_connect(isop)) != 0) {
+ pk_disconnect((struct pklcd *) isop->isop_chan);
isop->isop_chan = 0;
- IFDEBUG(D_CCONS)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CCONS]) {
printf("tpcons_output: can't reconnect\n");
- ENDDEBUG
+ }
+#endif
}
} else {
- error = pk_send(isop->isop_chan, m);
+ error = pk_send(m, isop->isop_chan);
IncStat(ts_tpdu_sent);
}
return error;
*/
int
-tpcons_dg_output(chan, m0, datalen)
- caddr_t chan;
- struct mbuf *m0;
- int datalen;
+#if __STDC__
+tpcons_output_dg(struct mbuf *m0, ...)
+#else
+tpcons_output_dg(m0, va_alist)
+ struct mbuf *m0;
+ va_dcl
+#endif
+{
+ int datalen;
+ caddr_t chan;
+ va_list ap;
+
+ va_start(ap, m0);
+ datalen = va_arg(ap, int);
+ chan = va_arg(ap, caddr_t);
+ va_end(ap);
+
+ return tpcons_output(m0, datalen,
+ ((struct pklcd *) chan)->lcd_upnext,
+ 0);
+}
+#else
+
+#include <sys/param.h>
+
+struct mbuf;
+
+int tpcons_output __P((struct mbuf *m0, ...));
+
+int
+#if __STDC__
+tpcons_output(struct mbuf *m0, ...)
+#else
+tpcons_output(m0, va_alist)
+ struct mbuf *m0;
+ va_dcl
+#endif
{
- return tpcons_output(((struct pklcd *)chan)->lcd_upnext, m0, datalen, 0);
+ return 0;
}
#endif /* TPCONS */
#endif /* ISO */
-/* $NetBSD: tp_driver.c,v 1.6 1994/06/29 06:40:01 cgd Exp $ */
-
-#define _XEBEC_PG static
+/* $OpenBSD: tp_driver.c,v 1.2 1996/03/04 10:35:53 mickey Exp $ */
+/* $NetBSD: tp_driver.c,v 1.7 1996/02/13 22:10:49 christos Exp $ */
#include "tp_states.h"
static struct act_ent {
- int a_newstate;
- int a_action;
-} statetable[] = { {0,0},
+ int a_newstate;
+ int a_action;
+} statetable[] = {{
+ 0, 0
+},
#include "tp_states.init"
};
#include <netiso/tp_trace.h>
#include <netiso/iso_errno.h>
#include <netiso/tp_seq.h>
+#include <netiso/tp_var.h>
#include <netiso/cons.h>
#define DRIVERTRACE TPPTdriver
#define sbwakeup(sb) sowakeup(p->tp_sock, sb);
#define MCPY(d, w) (d ? m_copym(d, 0, (int)M_COPYALL, w): 0)
-static trick_hc = 1;
-
-int tp_emit(),
- tp_goodack(), tp_goodXack(),
- tp_stash()
-;
-void tp_indicate(), tp_getoptions(),
- tp_soisdisconnecting(), tp_soisdisconnected(),
- tp_recycle_tsuffix(),
-#ifdef TP_DEBUG_TIMERS
- tp_etimeout(), tp_euntimeout(),
- tp_ctimeout(), tp_cuntimeout(),
- tp_ctimeout_MIN(),
-#endif
- tp_freeref(), tp_detach(),
- tp0_stash(), tp0_send(),
- tp_netcmd(), tp_send()
-;
-
-typedef struct tp_pcb tpcb_struct;
-
-
-
-typedef tpcb_struct tp_PCB_;
+static trick_hc = 1;
#include "tp_events.h"
+static int _Xebec_action __P((int, struct tp_event *, struct tp_pcb *));
+static int _Xebec_index __P((struct tp_event *, struct tp_pcb *));
-_XEBEC_PG int _Xebec_action(a,e,p)
-int a;
-struct tp_event *e;
-tp_PCB_ *p;
+static int
+_Xebec_action(a, e, p)
+ int a;
+ struct tp_event *e;
+ struct tp_pcb *p;
{
-switch(a) {
-case -1: return tp_protocol_error(e,p);
-case 0x1:
- {
- (void) tp_emit(DC_TPDU_type, p, 0, 0, MNULL);
- }
- break;
-case 0x2:
- {
-# ifdef TP_DEBUG
- if( e->ev_number != AK_TPDU )
+ int error;
+ struct mbuf *data = NULL;
+ int doack;
+ struct socket *so = p->tp_sock;
+ struct sockbuf *sb;
+ int timo;
+
+ switch (a) {
+ case -1:
+ return tp_protocol_error(e, p);
+ case 0x1:
+ (void) tp_emit(DC_TPDU_type, p, 0, 0, NULL);
+ break;
+ case 0x2:
+#ifdef TP_DEBUG
+ if (e->ev_number != AK_TPDU)
printf("TPDU 0x%x in REFWAIT!!!!\n", e->ev_number);
-# endif TP_DEBUG
- }
- break;
-case 0x3:
- {
+#endif /* TP_DEBUG */
+ break;
+ case 0x3:
/* oh, man is this grotesque or what? */
- (void) tp_goodack(p, e->ev_union.EV_AK_TPDU.e_cdt, e->ev_union.EV_AK_TPDU.e_seq, e->ev_union.EV_AK_TPDU.e_subseq);
- /* but it's necessary because this pseudo-ack may happen
- * before the CC arrives, but we HAVE to adjust the
- * snduna as a result of the ack, WHENEVER it arrives
+ (void) tp_goodack(p, e->ev_union.EV_AK_TPDU.e_cdt, e->ev_union.EV_AK_TPDU.e_seq, e->ev_union.EV_AK_TPDU.e_subseq);
+ /*
+ * but it's necessary because this pseudo-ack may
+ * happen before the CC arrives, but we HAVE to
+ * adjust the snduna as a result of the ack, WHENEVER
+ * it arrives
*/
- }
- break;
-case 0x4:
- {
+ break;
+ case 0x4:
tp_detach(p);
- }
- break;
-case 0x5:
- {
- p->tp_refstate = REF_OPEN; /* has timers ??? */
- }
- break;
-case 0x6:
- {
- IFTRACE(D_CONN)
- tptrace(TPPTmisc, "CR datalen data", e->ev_union.EV_CR_TPDU.e_datalen, e->ev_union.EV_CR_TPDU.e_data,0,0);
- ENDTRACE
- IFDEBUG(D_CONN)
- printf("CR datalen 0x%x data 0x%x", e->ev_union.EV_CR_TPDU.e_datalen, e->ev_union.EV_CR_TPDU.e_data);
- ENDDEBUG
- p->tp_refstate = REF_OPEN; /* has timers */
+ break;
+ case 0x5:
+ p->tp_refstate = REF_OPEN; /* has timers ??? */
+ break;
+ case 0x6:
+#ifdef TPPT
+ if (tp_traceflags[D_CONN])
+ tptrace(TPPTmisc, "CR datalen data",
+ e->ev_union.EV_CR_TPDU.e_datalen,
+ e->ev_union.EV_CR_TPDU.e_data, 0, 0);
+#endif
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
+ printf("CR datalen 0x%x data 0x%x",
+ e->ev_union.EV_CR_TPDU.e_datalen,
+ e->ev_union.EV_CR_TPDU.e_data);
+ }
+#endif
+ p->tp_refstate = REF_OPEN; /* has timers */
p->tp_fcredit = e->ev_union.EV_CR_TPDU.e_cdt;
if (e->ev_union.EV_CR_TPDU.e_datalen > 0) {
/* n/a for class 0 */
- ASSERT(p->tp_Xrcv.sb_cc == 0);
- sbappendrecord(&p->tp_Xrcv, e->ev_union.EV_CR_TPDU.e_data);
- e->ev_union.EV_CR_TPDU.e_data = MNULL;
- }
- }
- break;
-case 0x7:
- {
+ ASSERT(p->tp_Xrcv.sb_cc == 0);
+ sbappendrecord(&p->tp_Xrcv,
+ e->ev_union.EV_CR_TPDU.e_data);
+ e->ev_union.EV_CR_TPDU.e_data = NULL;
+ }
+ break;
+ case 0x7:
IncStat(ts_tp0_conn);
- IFTRACE(D_CONN)
- tptrace(TPPTmisc, "Confiming", p, 0,0,0);
- ENDTRACE
- IFDEBUG(D_CONN)
- printf("Confirming connection: p" );
- ENDDEBUG
+#ifdef TPPT
+ if (tp_traceflags[D_CONN])
+ tptrace(TPPTmisc, "Confiming", p, 0, 0, 0);
+#endif
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
+ printf("Confirming connection: p");
+ }
+#endif
soisconnected(p->tp_sock);
- (void) tp_emit(CC_TPDU_type, p, 0,0, MNULL) ;
+ (void) tp_emit(CC_TPDU_type, p, 0, 0, NULL);
p->tp_fcredit = 1;
- }
- break;
-case 0x8:
- {
- IncStat(ts_tp4_conn); /* even though not quite open */
- IFTRACE(D_CONN)
- tptrace(TPPTmisc, "Confiming", p, 0,0,0);
- ENDTRACE
- IFDEBUG(D_CONN)
- printf("Confirming connection: p" );
- ENDDEBUG
+ break;
+ case 0x8:
+ IncStat(ts_tp4_conn); /* even though not quite open */
+#ifdef TPPT
+ if (tp_traceflags[D_CONN])
+ tptrace(TPPTmisc, "Confiming", p, 0, 0, 0);
+#endif
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
+ printf("Confirming connection: p");
+ }
+#endif
tp_getoptions(p);
soisconnecting(p->tp_sock);
if ((p->tp_rx_strat & TPRX_FASTSTART) && (p->tp_fcredit > 0))
p->tp_cong_win = p->tp_fcredit * p->tp_l_tpdusize;
p->tp_retrans = p->tp_Nretrans;
- tp_ctimeout(p, TM_retrans, (int)p->tp_cc_ticks);
- }
- break;
-case 0x9:
- {
- IFDEBUG(D_CONN)
- printf("event: CR_TPDU emit CC failed done " );
- ENDDEBUG
+ tp_ctimeout(p, TM_retrans, (int) p->tp_cc_ticks);
+ break;
+ case 0x9:
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
+ printf("event: CR_TPDU emit CC failed done ");
+ }
+#endif
soisdisconnected(p->tp_sock);
tp_recycle_tsuffix(p);
tp_freeref(p->tp_lref);
tp_detach(p);
- }
- break;
-case 0xa:
- {
- int error;
- struct mbuf *data = MNULL;
-
- IFTRACE(D_CONN)
- tptrace(TPPTmisc, "T_CONN_req flags ucddata", (int)p->tp_flags,
- p->tp_ucddata, 0, 0);
- ENDTRACE
- data = MCPY(p->tp_ucddata, M_WAIT);
+ break;
+ case 0xa:
+#ifdef TPPT
+ if (tp_traceflags[D_CONN])
+ tptrace(TPPTmisc, "T_CONN_req flags ucddata",
+ (int) p->tp_flags, p->tp_ucddata, 0, 0);
+#endif
+ data = MCPY(p->tp_ucddata, M_WAIT);
if (data) {
- IFDEBUG(D_CONN)
- printf("T_CONN_req.trans m_copy cc 0x%x\n",
- p->tp_ucddata);
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
+ printf("T_CONN_req.trans m_copy cc 0x%x\n",
+ p->tp_ucddata);
dump_mbuf(data, "sosnd @ T_CONN_req");
- ENDDEBUG
+ }
+#endif
}
+ if ((error = tp_emit(CR_TPDU_type, p, 0, 0, data)) != 0)
+ return error; /* driver WON'T change state;
+ * will return error */
- if (error = tp_emit(CR_TPDU_type, p, 0, 0, data) )
- return error; /* driver WON'T change state; will return error */
-
- p->tp_refstate = REF_OPEN; /* has timers */
- if(p->tp_class != TP_CLASS_0) {
+ p->tp_refstate = REF_OPEN; /* has timers */
+ if (p->tp_class != TP_CLASS_0) {
p->tp_retrans = p->tp_Nretrans;
- tp_ctimeout(p, TM_retrans, (int)p->tp_cr_ticks);
+ tp_ctimeout(p, TM_retrans, (int) p->tp_cr_ticks);
}
- }
- break;
-case 0xb:
- {
- sbflush(&p->tp_Xrcv); /* purge non-delivered data data */
+ break;
+ case 0xb:
+ sbflush(&p->tp_Xrcv); /* purge non-delivered data
+ * data */
if (e->ev_union.EV_DR_TPDU.e_datalen > 0) {
sbappendrecord(&p->tp_Xrcv, e->ev_union.EV_DR_TPDU.e_data);
- e->ev_union.EV_DR_TPDU.e_data = MNULL;
- }
+ e->ev_union.EV_DR_TPDU.e_data = NULL;
+ }
if (p->tp_state == TP_OPEN)
tp_indicate(T_DISCONNECT, p, 0);
else {
- int so_error = ECONNREFUSED;
+ int so_error = ECONNREFUSED;
if (e->ev_union.EV_DR_TPDU.e_reason != (E_TP_NO_SESSION ^ TP_ERROR_MASK) &&
e->ev_union.EV_DR_TPDU.e_reason != (E_TP_NO_CR_ON_NC ^ TP_ERROR_MASK) &&
e->ev_union.EV_DR_TPDU.e_reason != (E_TP_REF_OVERFLOW ^ TP_ERROR_MASK))
}
tp_soisdisconnected(p);
if (p->tp_class != TP_CLASS_0) {
- if (p->tp_state == TP_OPEN ) {
- tp_euntimeout(p, TM_data_retrans); /* all */
+ if (p->tp_state == TP_OPEN) {
+ tp_euntimeout(p, TM_data_retrans);/* all */
tp_cuntimeout(p, TM_retrans);
tp_cuntimeout(p, TM_inact);
tp_cuntimeout(p, TM_sendack);
p->tp_flags &= ~TPF_DELACK;
}
tp_cuntimeout(p, TM_retrans);
- if( e->ev_union.EV_DR_TPDU.e_sref != 0 )
- (void) tp_emit(DC_TPDU_type, p, 0, 0, MNULL);
+ if (e->ev_union.EV_DR_TPDU.e_sref != 0)
+ (void) tp_emit(DC_TPDU_type, p, 0, 0, NULL);
}
- }
- break;
-case 0xc:
- {
- if( e->ev_union.EV_DR_TPDU.e_sref != 0 )
- (void) tp_emit(DC_TPDU_type, p, 0, 0, MNULL);
- /* reference timer already set - reset it to be safe (???) */
- tp_euntimeout(p, TM_reference); /* all */
- tp_etimeout(p, TM_reference, (int)p->tp_refer_ticks);
- }
- break;
-case 0xd:
- {
+ break;
+ case 0xc:
+ if (e->ev_union.EV_DR_TPDU.e_sref != 0)
+ (void) tp_emit(DC_TPDU_type, p, 0, 0, NULL);
+ /*
+ * reference timer already set - reset it to be safe
+ * (???)
+ */
+ tp_euntimeout(p, TM_reference); /* all */
+ tp_etimeout(p, TM_reference, (int) p->tp_refer_ticks);
+ break;
+ case 0xd:
tp_cuntimeout(p, TM_retrans);
tp_indicate(ER_TPDU, p, e->ev_union.EV_ER_TPDU.e_reason);
tp_soisdisconnected(p);
- }
- break;
-case 0xe:
- {
+ break;
+ case 0xe:
tp_cuntimeout(p, TM_retrans);
tp_soisdisconnected(p);
- }
- break;
-case 0xf:
- {
+ break;
+ case 0xf:
tp_indicate(ER_TPDU, p, e->ev_union.EV_ER_TPDU.e_reason);
tp_cuntimeout(p, TM_retrans);
tp_soisdisconnected(p);
- }
- break;
-case 0x10:
- {
+ break;
+ case 0x10:
tp_cuntimeout(p, TM_retrans);
tp_soisdisconnected(p);
- }
- break;
-case 0x11:
- { /* don't ask me why we have to do this - spec says so */
- (void) tp_emit(DR_TPDU_type, p, 0, E_TP_NO_SESSION, MNULL);
+ break;
+ case 0x11:
+ /* don't ask me why we have to do this - spec
+ * says so */
+ (void) tp_emit(DR_TPDU_type, p, 0, E_TP_NO_SESSION, NULL);
/* don't bother with retransmissions of the DR */
- }
- break;
-case 0x12:
- {
+ break;
+ case 0x12:
tp_soisdisconnecting(p->tp_sock);
tp_indicate(ER_TPDU, p, e->ev_union.EV_ER_TPDU.e_reason);
tp_soisdisconnected(p);
- tp_netcmd( p, CONN_CLOSE );
- }
- break;
-case 0x13:
- {
+ tp_netcmd(p, CONN_CLOSE);
+ break;
+ case 0x13:
if (p->tp_state == TP_OPEN) {
- tp_euntimeout(p, TM_data_retrans); /* all */
+ tp_euntimeout(p, TM_data_retrans); /* all */
tp_cuntimeout(p, TM_inact);
tp_cuntimeout(p, TM_sendack);
}
tp_soisdisconnecting(p->tp_sock);
tp_indicate(ER_TPDU, p, e->ev_union.EV_ER_TPDU.e_reason);
p->tp_retrans = p->tp_Nretrans;
- tp_ctimeout(p, TM_retrans, (int)p->tp_dr_ticks);
- (void) tp_emit(DR_TPDU_type, p, 0, E_TP_PROTO_ERR, MNULL);
- }
- break;
-case 0x14:
- {
+ tp_ctimeout(p, TM_retrans, (int) p->tp_dr_ticks);
+ (void) tp_emit(DR_TPDU_type, p, 0, E_TP_PROTO_ERR, NULL);
+ break;
+ case 0x14:
tp_cuntimeout(p, TM_retrans);
IncStat(ts_tp0_conn);
p->tp_fcredit = 1;
soisconnected(p->tp_sock);
- }
- break;
-case 0x15:
- {
- IFDEBUG(D_CONN)
- printf("trans: CC_TPDU in CRSENT state flags 0x%x\n",
- (int)p->tp_flags);
- ENDDEBUG
+ break;
+ case 0x15:
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
+ printf("trans: CC_TPDU in CRSENT state flags 0x%x\n",
+ (int) p->tp_flags);
+ }
+#endif
IncStat(ts_tp4_conn);
p->tp_fref = e->ev_union.EV_CC_TPDU.e_sref;
p->tp_fcredit = e->ev_union.EV_CC_TPDU.e_cdt;
- if ((p->tp_rx_strat & TPRX_FASTSTART) && (e->ev_union.EV_CC_TPDU.e_cdt > 0))
+ if ((p->tp_rx_strat & TPRX_FASTSTART) &&
+ (e->ev_union.EV_CC_TPDU.e_cdt > 0))
p->tp_cong_win = e->ev_union.EV_CC_TPDU.e_cdt * p->tp_l_tpdusize;
tp_getoptions(p);
tp_cuntimeout(p, TM_retrans);
if (p->tp_ucddata) {
- IFDEBUG(D_CONN)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
printf("dropping user connect data cc 0x%x\n",
- p->tp_ucddata->m_len);
- ENDDEBUG
+ p->tp_ucddata->m_len);
+ }
+#endif
m_freem(p->tp_ucddata);
p->tp_ucddata = 0;
}
soisconnected(p->tp_sock);
if (e->ev_union.EV_CC_TPDU.e_datalen > 0) {
- ASSERT(p->tp_Xrcv.sb_cc == 0); /* should be empty */
- sbappendrecord(&p->tp_Xrcv, e->ev_union.EV_CC_TPDU.e_data);
- e->ev_union.EV_CC_TPDU.e_data = MNULL;
+ ASSERT(p->tp_Xrcv.sb_cc == 0); /* should be empty */
+ sbappendrecord(&p->tp_Xrcv,
+ e->ev_union.EV_CC_TPDU.e_data);
+ e->ev_union.EV_CC_TPDU.e_data = NULL;
}
-
- (void) tp_emit(AK_TPDU_type, p, p->tp_rcvnxt, 0, MNULL);
- tp_ctimeout(p, TM_inact, (int)p->tp_inact_ticks);
- }
- break;
-case 0x16:
- {
- struct mbuf *data = MNULL;
- int error;
-
+ (void) tp_emit(AK_TPDU_type, p, p->tp_rcvnxt, 0, NULL);
+ tp_ctimeout(p, TM_inact, (int) p->tp_inact_ticks);
+ break;
+ case 0x16:
IncStat(ts_retrans_cr);
p->tp_cong_win = 1 * p->tp_l_tpdusize;
data = MCPY(p->tp_ucddata, M_NOWAIT);
- if(p->tp_ucddata) {
- IFDEBUG(D_CONN)
- printf("TM_retrans.trans m_copy cc 0x%x\n", data);
+ if (p->tp_ucddata) {
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
+ printf("TM_retrans.trans m_copy cc 0x%x\n",
+ data);
dump_mbuf(p->tp_ucddata, "sosnd @ TM_retrans");
- ENDDEBUG
- if( data == MNULL )
+ }
+#endif
+ if (data == NULL)
return ENOBUFS;
}
-
- p->tp_retrans --;
- if( error = tp_emit(CR_TPDU_type, p, 0, 0, data) ) {
+ p->tp_retrans--;
+ if ((error = tp_emit(CR_TPDU_type, p, 0, 0, data)) != 0) {
p->tp_sock->so_error = error;
}
- tp_ctimeout(p, TM_retrans, (int)p->tp_cr_ticks);
- }
- break;
-case 0x17:
- {
+ tp_ctimeout(p, TM_retrans, (int) p->tp_cr_ticks);
+ break;
+ case 0x17:
IncStat(ts_conn_gaveup);
p->tp_sock->so_error = ETIMEDOUT;
tp_indicate(T_DISCONNECT, p, ETIMEDOUT);
tp_soisdisconnected(p);
- }
- break;
-case 0x18:
- {
- int error;
- struct mbuf *data = MCPY(p->tp_ucddata, M_WAIT);
+ break;
+ case 0x18:
+ data = MCPY(p->tp_ucddata, M_WAIT);
- if( error = tp_emit(CC_TPDU_type, p, 0, 0, data) ) {
+ if ((error = tp_emit(CC_TPDU_type, p, 0, 0, data)) != 0) {
p->tp_sock->so_error = error;
}
p->tp_retrans = p->tp_Nretrans;
- tp_ctimeout(p, TM_retrans, (int)p->tp_cc_ticks);
- }
- break;
-case 0x19:
- {
- int doack;
-
+ tp_ctimeout(p, TM_retrans, (int) p->tp_cc_ticks);
+ break;
+ case 0x19:
/*
* Get rid of any confirm or connect data, so that if we
* crash or close, it isn't thought of as disconnect data.
m_freem(p->tp_ucddata);
p->tp_ucddata = 0;
}
- tp_ctimeout(p, TM_inact, (int)p->tp_inact_ticks);
+ tp_ctimeout(p, TM_inact, (int) p->tp_inact_ticks);
tp_cuntimeout(p, TM_retrans);
soisconnected(p->tp_sock);
- tp_ctimeout(p, TM_inact, (int)p->tp_inact_ticks);
+ tp_ctimeout(p, TM_inact, (int) p->tp_inact_ticks);
- /* see also next 2 transitions, if you make any changes */
+ /*
+ * see also next 2 transitions, if you make any
+ * changes
+ */
doack = tp_stash(p, e);
- IFDEBUG(D_DATA)
- printf("tp_stash returns %d\n",doack);
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_DATA]) {
+ printf("tp_stash returns %d\n", doack);
+ }
+#endif
if (doack) {
- (void) tp_emit(AK_TPDU_type, p, p->tp_rcvnxt, 0, MNULL );
- tp_ctimeout(p, TM_sendack, (int)p->tp_keepalive_ticks);
+ (void) tp_emit(AK_TPDU_type, p, p->tp_rcvnxt, 0, NULL);
+ tp_ctimeout(p, TM_sendack, (int) p->tp_keepalive_ticks);
} else
- tp_ctimeout( p, TM_sendack, (int)p->tp_sendack_ticks);
-
- IFDEBUG(D_DATA)
+ tp_ctimeout(p, TM_sendack, (int) p->tp_sendack_ticks);
+
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_DATA]) {
printf("after stash calling sbwakeup\n");
- ENDDEBUG
- }
- break;
-case 0x1a:
- {
+ }
+#endif
+ break;
+ case 0x1a:
tp0_stash(p, e);
- sbwakeup( &p->tp_sock->so_rcv );
+ sbwakeup(&p->tp_sock->so_rcv);
- IFDEBUG(D_DATA)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_DATA]) {
printf("after stash calling sbwakeup\n");
- ENDDEBUG
- }
- break;
-case 0x1b:
- {
- int doack; /* tells if we must ack immediately */
-
- tp_ctimeout(p, TM_inact, (int)p->tp_inact_ticks);
- sbwakeup( &p->tp_sock->so_rcv );
+ }
+#endif
+ break;
+ case 0x1b:
+ tp_ctimeout(p, TM_inact, (int) p->tp_inact_ticks);
+ sbwakeup(&p->tp_sock->so_rcv);
doack = tp_stash(p, e);
- IFDEBUG(D_DATA)
- printf("tp_stash returns %d\n",doack);
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_DATA]) {
+ printf("tp_stash returns %d\n", doack);
+ }
+#endif
- if(doack)
- (void) tp_emit(AK_TPDU_type, p, p->tp_rcvnxt, 0, MNULL );
+ if (doack)
+ (void) tp_emit(AK_TPDU_type, p, p->tp_rcvnxt, 0, NULL);
else
- tp_ctimeout_MIN( p, TM_sendack, (int)p->tp_sendack_ticks);
-
- IFDEBUG(D_DATA)
+ tp_ctimeout_MIN(p, TM_sendack, (int) p->tp_sendack_ticks);
+
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_DATA]) {
printf("after stash calling sbwakeup\n");
- ENDDEBUG
- }
- break;
-case 0x1c:
- {
- IFTRACE(D_DATA)
+ }
+#endif
+ break;
+ case 0x1c:
+#ifdef TPPT
+ if (tp_traceflags[D_DATA])
tptrace(TPPTmisc, "NIW seq rcvnxt lcredit ",
- e->ev_union.EV_DT_TPDU.e_seq, p->tp_rcvnxt, p->tp_lcredit, 0);
- ENDTRACE
+ e->ev_union.EV_DT_TPDU.e_seq,
+ p->tp_rcvnxt, p->tp_lcredit, 0);
+#endif
IncStat(ts_dt_niw);
m_freem(e->ev_union.EV_DT_TPDU.e_data);
- tp_ctimeout(p, TM_inact, (int)p->tp_inact_ticks);
- (void) tp_emit(AK_TPDU_type, p, p->tp_rcvnxt, 0, MNULL );
- }
- break;
-case 0x1d:
- {
+ tp_ctimeout(p, TM_inact, (int) p->tp_inact_ticks);
+ (void) tp_emit(AK_TPDU_type, p, p->tp_rcvnxt, 0, NULL);
+ break;
+ case 0x1d:
if (p->tp_ucddata) {
m_freem(p->tp_ucddata);
p->tp_ucddata = 0;
tp_cuntimeout(p, TM_retrans);
soisconnected(p->tp_sock);
- IFTRACE(D_CONN)
- struct socket *so = p->tp_sock;
- tptrace(TPPTmisc,
+#ifdef TPPT
+ if (tp_traceflags[D_CONN]) {
+ struct socket *so = p->tp_sock;
+ tptrace(TPPTmisc,
"called sosiconn: so so_state rcv.sb_sel rcv.sb_flags",
- so, so->so_state, so->so_rcv.sb_sel, so->so_rcv.sb_flags);
- tptrace(TPPTmisc,
- "called sosiconn 2: so_qlen so_error so_rcv.sb_cc so_head",
- so->so_qlen, so->so_error, so->so_rcv.sb_cc, so->so_head);
- ENDTRACE
-
- tp_ctimeout(p, TM_sendack, (int)p->tp_keepalive_ticks);
- tp_ctimeout(p, TM_inact, (int)p->tp_inact_ticks);
- }
- break;
-case 0x1e:
- {
- if( p->tp_state == TP_AKWAIT ) {
+ so, so->so_state, so->so_rcv.sb_sel,
+ so->so_rcv.sb_flags);
+ tptrace(TPPTmisc,
+ "called sosiconn 2: so_qlen so_error so_rcv.sb_cc so_head",
+ so->so_qlen, so->so_error, so->so_rcv.sb_cc,
+ so->so_head);
+ }
+#endif
+
+ tp_ctimeout(p, TM_sendack, (int) p->tp_keepalive_ticks);
+ tp_ctimeout(p, TM_inact, (int) p->tp_inact_ticks);
+ break;
+ case 0x1e:
+ if (p->tp_state == TP_AKWAIT) {
if (p->tp_ucddata) {
m_freem(p->tp_ucddata);
p->tp_ucddata = 0;
}
tp_cuntimeout(p, TM_retrans);
soisconnected(p->tp_sock);
- tp_ctimeout(p, TM_sendack, (int)p->tp_keepalive_ticks);
- tp_ctimeout(p, TM_inact, (int)p->tp_inact_ticks);
- }
- IFTRACE(D_XPD)
- tptrace(TPPTmisc, "XPD tpdu accepted Xrcvnxt, e_seq datalen m_len\n",
- p->tp_Xrcvnxt,e->ev_union.EV_XPD_TPDU.e_seq, e->ev_union.EV_XPD_TPDU.e_datalen, e->ev_union.EV_XPD_TPDU.e_data->m_len);
- ENDTRACE
+ tp_ctimeout(p, TM_sendack, (int) p->tp_keepalive_ticks);
+ tp_ctimeout(p, TM_inact, (int) p->tp_inact_ticks);
+ }
+#ifdef TPPT
+ if (tp_traceflags[D_XPD]) {
+ tptrace(TPPTmisc, "XPD tpdu accepted Xrcvnxt,
+ e_seq datalen m_len\n", p->tp_Xrcvnxt,
+ e->ev_union.EV_XPD_TPDU.e_seq,
+ e->ev_union.EV_XPD_TPDU.e_datalen,
+ e->ev_union.EV_XPD_TPDU.e_data->m_len);
+ }
+#endif
p->tp_sock->so_state |= SS_RCVATMARK;
e->ev_union.EV_XPD_TPDU.e_data->m_flags |= M_EOR;
sbinsertoob(&p->tp_Xrcv, e->ev_union.EV_XPD_TPDU.e_data);
- IFDEBUG(D_XPD)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_XPD]) {
dump_mbuf(e->ev_union.EV_XPD_TPDU.e_data, "XPD TPDU: tp_Xrcv");
- ENDDEBUG
+ }
+#endif
tp_indicate(T_XDATA, p, 0);
- sbwakeup( &p->tp_Xrcv );
+ sbwakeup(&p->tp_Xrcv);
- (void) tp_emit(XAK_TPDU_type, p, p->tp_Xrcvnxt, 0, MNULL);
+ (void) tp_emit(XAK_TPDU_type, p, p->tp_Xrcvnxt, 0, NULL);
SEQ_INC(p, p->tp_Xrcvnxt);
- }
- break;
-case 0x1f:
- {
- if( p->tp_Xrcv.sb_cc == 0 ) {
- /* kludge for select(): */
+ break;
+ case 0x1f:
+ if (p->tp_Xrcv.sb_cc == 0) {
+ /* kludge for select(): */
/* p->tp_sock->so_state &= ~SS_OOBAVAIL; */
}
- }
- break;
-case 0x20:
- {
- IFTRACE(D_XPD)
- tptrace(TPPTmisc, "XPD tpdu niw (Xrcvnxt, e_seq) or not cdt (cc)\n",
- p->tp_Xrcvnxt, e->ev_union.EV_XPD_TPDU.e_seq, p->tp_Xrcv.sb_cc , 0);
- ENDTRACE
- if( p->tp_Xrcvnxt != e->ev_union.EV_XPD_TPDU.e_seq )
+ break;
+ case 0x20:
+#ifdef TPPT
+ if (tp_traceflags[D_XPD])
+ tptrace(TPPTmisc,
+ "XPD tpdu niw (Xrcvnxt, e_seq) or not cdt (cc)\n",
+ p->tp_Xrcvnxt, e->ev_union.EV_XPD_TPDU.e_seq,
+ p->tp_Xrcv.sb_cc, 0);
+#endif
+ if (p->tp_Xrcvnxt != e->ev_union.EV_XPD_TPDU.e_seq)
IncStat(ts_xpd_niw);
- if( p->tp_Xrcv.sb_cc ) {
+ if (p->tp_Xrcv.sb_cc) {
/* might as well kick 'em again */
tp_indicate(T_XDATA, p, 0);
IncStat(ts_xpd_dup);
}
m_freem(e->ev_union.EV_XPD_TPDU.e_data);
- tp_ctimeout(p, TM_inact, (int)p->tp_inact_ticks);
- /* don't send an xack because the xak gives "last one received", not
- * "next one i expect" (dumb)
+ tp_ctimeout(p, TM_inact, (int) p->tp_inact_ticks);
+ /*
+ * don't send an xack because the xak gives "last one
+ * received", not "next one i expect" (dumb)
*/
- }
- break;
-case 0x21:
- {
- struct socket *so = p->tp_sock;
-
+ break;
+ case 0x21:
/* detach from parent socket so it can finish closing */
if (so->so_head) {
if (!soqremque(so, 0) && !soqremque(so, 1))
so->so_head = 0;
}
tp_soisdisconnecting(p->tp_sock);
- tp_netcmd( p, CONN_CLOSE);
+ tp_netcmd(p, CONN_CLOSE);
tp_soisdisconnected(p);
- }
- break;
-case 0x22:
- {
- struct socket *so = p->tp_sock;
- struct mbuf *data = MNULL;
-
+ break;
+ case 0x22:
/* detach from parent socket so it can finish closing */
if (so->so_head) {
if (!soqremque(so, 0) && !soqremque(so, 1))
data = MCPY(p->tp_ucddata, M_NOWAIT);
(void) tp_emit(DR_TPDU_type, p, 0, E_TP_NORMAL_DISC, data);
p->tp_retrans = p->tp_Nretrans;
- tp_ctimeout(p, TM_retrans, (int)p->tp_dr_ticks);
+ tp_ctimeout(p, TM_retrans, (int) p->tp_dr_ticks);
}
- }
- break;
-case 0x23:
- {
+ break;
+ case 0x23:
tp_soisdisconnecting(p->tp_sock);
- tp_netcmd( p, CONN_CLOSE);
+ tp_netcmd(p, CONN_CLOSE);
tp_soisdisconnected(p);
- }
- break;
-case 0x24:
- {
- struct mbuf *data = MCPY(p->tp_ucddata, M_WAIT);
+ break;
+ case 0x24:
+ data = MCPY(p->tp_ucddata, M_WAIT);
- if(p->tp_state == TP_OPEN) {
- tp_euntimeout(p, TM_data_retrans); /* all */
+ if (p->tp_state == TP_OPEN) {
+ tp_euntimeout(p, TM_data_retrans); /* all */
tp_cuntimeout(p, TM_inact);
tp_cuntimeout(p, TM_sendack);
p->tp_flags &= ~TPF_DELACK;
}
if (data) {
- IFDEBUG(D_CONN)
- printf("T_DISC_req.trans tp_ucddata 0x%x\n",
- p->tp_ucddata);
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
+ printf("T_DISC_req.trans tp_ucddata 0x%x\n",
+ p->tp_ucddata);
dump_mbuf(data, "ucddata @ T_DISC_req");
- ENDDEBUG
+ }
+#endif
}
tp_soisdisconnecting(p->tp_sock);
p->tp_retrans = p->tp_Nretrans;
- tp_ctimeout(p, TM_retrans, (int)p->tp_dr_ticks);
+ tp_ctimeout(p, TM_retrans, (int) p->tp_dr_ticks);
- if( trick_hc )
- return tp_emit(DR_TPDU_type, p, 0, e->ev_union.EV_T_DISC_req.e_reason, data);
- }
- break;
-case 0x25:
- {
- int error;
- struct mbuf *data = MCPY(p->tp_ucddata, M_WAIT);
+ if (trick_hc)
+ return tp_emit(DR_TPDU_type, p, 0,
+ e->ev_union.EV_REQ_TPDU.e_reason,
+ data);
+ break;
+ case 0x25:
+ data = MCPY(p->tp_ucddata, M_WAIT);
IncStat(ts_retrans_cc);
- p->tp_retrans --;
+ p->tp_retrans--;
p->tp_cong_win = 1 * p->tp_l_tpdusize;
- if( error = tp_emit(CC_TPDU_type, p, 0, 0, data) )
+ if ((error = tp_emit(CC_TPDU_type, p, 0, 0, data)) != 0)
p->tp_sock->so_error = error;
- tp_ctimeout(p, TM_retrans, (int)p->tp_cc_ticks);
- }
- break;
-case 0x26:
- {
+ tp_ctimeout(p, TM_retrans, (int) p->tp_cc_ticks);
+ break;
+ case 0x26:
IncStat(ts_conn_gaveup);
tp_soisdisconnecting(p->tp_sock);
p->tp_sock->so_error = ETIMEDOUT;
tp_indicate(T_DISCONNECT, p, ETIMEDOUT);
- (void) tp_emit(DR_TPDU_type, p, 0, E_TP_CONGEST, MNULL);
+ (void) tp_emit(DR_TPDU_type, p, 0, E_TP_CONGEST, NULL);
p->tp_retrans = p->tp_Nretrans;
- tp_ctimeout(p, TM_retrans, (int)p->tp_dr_ticks);
- }
- break;
-case 0x27:
- {
- tp_euntimeout(p, TM_data_retrans); /* all */
- tp_cuntimeout(p, TM_inact);
+ tp_ctimeout(p, TM_retrans, (int) p->tp_dr_ticks);
+ break;
+ case 0x27:
+ tp_euntimeout(p, TM_data_retrans); /* all */
+ tp_cuntimeout(p, TM_inact);
tp_cuntimeout(p, TM_sendack);
IncStat(ts_conn_gaveup);
tp_soisdisconnecting(p->tp_sock);
p->tp_sock->so_error = ETIMEDOUT;
tp_indicate(T_DISCONNECT, p, ETIMEDOUT);
- (void) tp_emit(DR_TPDU_type, p, 0, E_TP_CONGEST_2, MNULL);
+ (void) tp_emit(DR_TPDU_type, p, 0, E_TP_CONGEST_2, NULL);
p->tp_retrans = p->tp_Nretrans;
- tp_ctimeout(p, TM_retrans, (int)p->tp_dr_ticks);
- }
- break;
-case 0x28:
- {
+ tp_ctimeout(p, TM_retrans, (int) p->tp_dr_ticks);
+ break;
+ case 0x28:
p->tp_cong_win = 1 * p->tp_l_tpdusize;
/* resume XPD */
- if ( p->tp_Xsnd.sb_mb ) {
- struct mbuf *m = m_copy(p->tp_Xsnd.sb_mb, 0, (int)p->tp_Xsnd.sb_cc);
- int shift;
-
- IFTRACE(D_XPD)
- tptrace(TPPTmisc, "XPD retrans: Xuna Xsndnxt sndnxt snduna",
- p->tp_Xuna, p->tp_Xsndnxt, p->tp_sndnxt,
- p->tp_snduna);
- ENDTRACE
- IFDEBUG(D_XPD)
+ if (p->tp_Xsnd.sb_mb) {
+ struct mbuf *m = m_copy(p->tp_Xsnd.sb_mb, 0,
+ (int) p->tp_Xsnd.sb_cc);
+ int shift;
+
+#ifdef TPPT
+ if (tp_traceflags[D_XPD]) {
+ tptrace(TPPTmisc,
+ "XPD retrans: Xuna Xsndnxt sndnxt snduna",
+ p->tp_Xuna, p->tp_Xsndnxt, p->tp_sndnxt,
+ p->tp_snduna);
+ }
+#endif
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_XPD]) {
dump_mbuf(m, "XPD retrans emitting M");
- ENDDEBUG
+ }
+#endif
IncStat(ts_retrans_xpd);
- p->tp_retrans --;
+ p->tp_retrans--;
shift = max(p->tp_Nretrans - p->tp_retrans, 6);
(void) tp_emit(XPD_TPDU_type, p, p->tp_Xuna, 1, m);
- tp_ctimeout(p, TM_retrans, ((int)p->tp_dt_ticks) << shift);
+ tp_ctimeout(p, TM_retrans, ((int) p->tp_dt_ticks) << shift);
}
- }
- break;
-case 0x29:
- {
+ break;
+ case 0x29:
p->tp_rxtshift++;
(void) tp_data_retrans(p);
- }
- break;
-case 0x2a:
- {
- p->tp_retrans --;
- (void) tp_emit(DR_TPDU_type, p, 0, E_TP_DR_NO_REAS, MNULL);
+ break;
+ case 0x2a:
+ p->tp_retrans--;
+ (void) tp_emit(DR_TPDU_type, p, 0, E_TP_DR_NO_REAS, NULL);
IncStat(ts_retrans_dr);
- tp_ctimeout(p, TM_retrans, (int)p->tp_dr_ticks);
- }
- break;
-case 0x2b:
- {
+ tp_ctimeout(p, TM_retrans, (int) p->tp_dr_ticks);
+ break;
+ case 0x2b:
p->tp_sock->so_error = ETIMEDOUT;
p->tp_refstate = REF_FROZEN;
- tp_recycle_tsuffix( p );
- tp_etimeout(p, TM_reference, (int)p->tp_refer_ticks);
- }
- break;
-case 0x2c:
- {
+ tp_recycle_tsuffix(p);
+ tp_etimeout(p, TM_reference, (int) p->tp_refer_ticks);
+ break;
+ case 0x2c:
tp_freeref(p->tp_lref);
tp_detach(p);
- }
- break;
-case 0x2d:
- {
- if( p->tp_class != TP_CLASS_0) {
- tp_ctimeout(p, TM_inact, (int)p->tp_inact_ticks);
- if ( e->ev_number == CC_TPDU )
- (void) tp_emit(AK_TPDU_type, p, p->tp_rcvnxt, 0, MNULL);
- }
- /* ignore it if class 0 - state tables are blank for this */
- }
- break;
-case 0x2e:
- {
- IFTRACE(D_DATA)
- tptrace(TPPTmisc, "T_DATA_req sndnxt snduna fcredit, tpcb",
+ break;
+ case 0x2d:
+ if (p->tp_class != TP_CLASS_0) {
+ tp_ctimeout(p, TM_inact, (int) p->tp_inact_ticks);
+ if (e->ev_number == CC_TPDU)
+ (void) tp_emit(AK_TPDU_type, p, p->tp_rcvnxt, 0, NULL);
+ }
+ /*
+ * ignore it if class 0 - state tables are blank for
+ * this
+ */
+ break;
+ case 0x2e:
+#ifdef TPPT
+ if (tp_traceflags[D_DATA])
+ tptrace(TPPTmisc,
+ "T_DATA_req sndnxt snduna fcredit, tpcb",
p->tp_sndnxt, p->tp_snduna, p->tp_fcredit, p);
- ENDTRACE
+#endif
tp_send(p);
- }
- break;
-case 0x2f:
- {
- int error = 0;
+ break;
+ case 0x2f:
+ error = 0;
/* resume XPD */
- if ( p->tp_Xsnd.sb_mb ) {
- struct mbuf *m = m_copy(p->tp_Xsnd.sb_mb, 0, (int)p->tp_Xsnd.sb_cc);
- /* m_copy doesn't preserve the m_xlink field, but at this pt.
- * that doesn't matter
+ if (p->tp_Xsnd.sb_mb) {
+ struct mbuf *m = m_copy(p->tp_Xsnd.sb_mb, 0, (int) p->tp_Xsnd.sb_cc);
+ /*
+ * m_copy doesn't preserve the m_xlink field,
+ * but at this pt. that doesn't matter
*/
- IFTRACE(D_XPD)
- tptrace(TPPTmisc, "XPD req: Xuna Xsndnxt sndnxt snduna",
- p->tp_Xuna, p->tp_Xsndnxt, p->tp_sndnxt,
- p->tp_snduna);
- ENDTRACE
- IFDEBUG(D_XPD)
+#ifdef TPPT
+ if (tp_traceflags[D_XPD])
+ tptrace(TPPTmisc,
+ "XPD req: Xuna Xsndnxt sndnxt snduna",
+ p->tp_Xuna, p->tp_Xsndnxt, p->tp_sndnxt,
+ p->tp_snduna);
+#endif
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_XPD]) {
printf("T_XPD_req: sb_cc 0x%x\n", p->tp_Xsnd.sb_cc);
dump_mbuf(m, "XPD req emitting M");
- ENDDEBUG
- error =
+ }
+#endif
+ error =
tp_emit(XPD_TPDU_type, p, p->tp_Xuna, 1, m);
p->tp_retrans = p->tp_Nretrans;
- tp_ctimeout(p, TM_retrans, (int)p->tp_rxtcur);
+ tp_ctimeout(p, TM_retrans, (int) p->tp_rxtcur);
SEQ_INC(p, p->tp_Xsndnxt);
- }
- if(trick_hc)
+ }
+ if (trick_hc)
return error;
- }
- break;
-case 0x30:
- {
- struct sockbuf *sb = &p->tp_sock->so_snd;
+ break;
+ case 0x30:
+ sb = &p->tp_sock->so_snd;
- IFDEBUG(D_ACKRECV)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ACKRECV]) {
printf("GOOD ACK seq 0x%x cdt 0x%x\n", e->ev_union.EV_AK_TPDU.e_seq, e->ev_union.EV_AK_TPDU.e_cdt);
- ENDDEBUG
- if( p->tp_class != TP_CLASS_0) {
- tp_ctimeout(p, TM_inact, (int)p->tp_inact_ticks);
+ }
+#endif
+ if (p->tp_class != TP_CLASS_0) {
+ tp_ctimeout(p, TM_inact, (int) p->tp_inact_ticks);
}
sbwakeup(sb);
- IFDEBUG(D_ACKRECV)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ACKRECV]) {
printf("GOOD ACK new sndnxt 0x%x\n", p->tp_sndnxt);
- ENDDEBUG
- }
- break;
-case 0x31:
- {
- IFTRACE(D_ACKRECV)
- tptrace(TPPTmisc, "BOGUS ACK fcc_present, tp_r_subseq e_subseq",
- e->ev_union.EV_AK_TPDU.e_fcc_present, p->tp_r_subseq, e->ev_union.EV_AK_TPDU.e_subseq, 0);
- ENDTRACE
- if( p->tp_class != TP_CLASS_0 ) {
-
- if ( !e->ev_union.EV_AK_TPDU.e_fcc_present ) {
+ }
+#endif
+ break;
+ case 0x31:
+#ifdef TPPT
+ if (tp_traceflags[D_ACKRECV])
+ tptrace(TPPTmisc, "BOGUS ACK fcc_present,
+ tp_r_subseq e_subseq",
+ e->ev_union.EV_AK_TPDU.e_fcc_present,
+ p->tp_r_subseq,
+ e->ev_union.EV_AK_TPDU.e_subseq, 0);
+#endif
+ if (p->tp_class != TP_CLASS_0) {
+
+ if (!e->ev_union.EV_AK_TPDU.e_fcc_present) {
/* send ACK with FCC */
- IncStat( ts_ackreason[_ACK_FCC_] );
- (void) tp_emit(AK_TPDU_type, p, p->tp_rcvnxt, 1, MNULL);
+ IncStat(ts_ackreason[_ACK_FCC_]);
+ (void) tp_emit(AK_TPDU_type, p, p->tp_rcvnxt,
+ 1, NULL);
}
- tp_ctimeout(p, TM_inact, (int)p->tp_inact_ticks);
- }
- }
- break;
-case 0x32:
- {
- tp_ctimeout(p, TM_inact, (int)p->tp_inact_ticks);
+ tp_ctimeout(p, TM_inact, (int) p->tp_inact_ticks);
+ }
+ break;
+ case 0x32:
+ tp_ctimeout(p, TM_inact, (int) p->tp_inact_ticks);
tp_cuntimeout(p, TM_retrans);
- sbwakeup( &p->tp_sock->so_snd );
+ sbwakeup(&p->tp_sock->so_snd);
/* resume normal data */
tp_send(p);
- }
- break;
-case 0x33:
- {
- IFTRACE(D_ACKRECV)
- tptrace(TPPTmisc, "BOGUS XACK eventtype ", e->ev_number, 0, 0,0);
- ENDTRACE
- if( p->tp_class != TP_CLASS_0 ) {
- tp_ctimeout(p, TM_inact, (int)p->tp_inact_ticks);
- }
- }
- break;
-case 0x34:
- {
- int timo;
- IFTRACE(D_TIMER)
- tptrace(TPPTsendack, -1, p->tp_lcredit, p->tp_sent_uwe,
- p->tp_sent_lcdt, 0);
- ENDTRACE
+ break;
+ case 0x33:
+#ifdef TPPT
+ if (tp_traceflags[D_ACKRECV])
+ tptrace(TPPTmisc, "BOGUS XACK eventtype ",
+ e->ev_number, 0, 0, 0);
+#endif
+ if (p->tp_class != TP_CLASS_0) {
+ tp_ctimeout(p, TM_inact, (int) p->tp_inact_ticks);
+ }
+ break;
+ case 0x34:
+#ifdef TPPT
+ if (tp_traceflags[D_TIMER])
+ tptrace(TPPTsendack, -1, p->tp_lcredit, p->tp_sent_uwe,
+ p->tp_sent_lcdt, 0);
+#endif
IncPStat(p, tps_n_TMsendack);
- (void) tp_emit(AK_TPDU_type, p, p->tp_rcvnxt, 0, MNULL);
+ (void) tp_emit(AK_TPDU_type, p, p->tp_rcvnxt, 0, NULL);
if (p->tp_fcredit == 0) {
if (p->tp_rxtshift < TP_MAXRXTSHIFT)
p->tp_rxtshift++;
} else
timo = p->tp_sendack_ticks;
tp_ctimeout(p, TM_sendack, timo);
- }
- break;
-case 0x35:
- {
+ break;
+ case 0x35:
if (sbspace(&p->tp_sock->so_rcv) > 0)
tp0_openflow(p);
- }
- break;
-case 0x36:
- {
- if( trick_hc ) {
- SeqNum ack_thresh;
+ break;
+ case 0x36:
+ if (trick_hc) {
+ SeqNum ack_thresh;
/*
* If the upper window edge has advanced a reasonable
* amount beyond what was known, send an ACK.
*/
LOCAL_CREDIT(p);
ack_thresh = SEQ_SUB(p, p->tp_lcredit + p->tp_rcvnxt,
- (p->tp_maxlcredit > 2 ? 2 : 1));
+ (p->tp_maxlcredit > 2 ? 2 : 1));
if (SEQ_GT(p, ack_thresh, p->tp_sent_uwe)) {
IncStat(ts_ackreason[_ACK_USRRCV_]);
p->tp_flags &= ~TPF_DELACK;
- return tp_emit(AK_TPDU_type, p, p->tp_rcvnxt, 0, MNULL);
+ return tp_emit(AK_TPDU_type, p, p->tp_rcvnxt, 0, NULL);
}
}
- }
- break;
-case 0x37:
- {
- if(trick_hc)
- return ECONNABORTED;
- }
- break;
-case 0x38:
- {
- ASSERT( p->tp_state != TP_LISTENING );
+ break;
+ case 0x37:
+ if (trick_hc)
+ return ECONNABORTED;
+ break;
+ case 0x38:
+ ASSERT(p->tp_state != TP_LISTENING);
tp_indicate(T_DISCONNECT, p, ECONNRESET);
tp_soisdisconnected(p);
+ break;
}
- break;
- }
-return 0;
+ return 0;
}
-_XEBEC_PG int
-_Xebec_index( e,p )
+static int
+_Xebec_index(e, p)
struct tp_event *e;
- tp_PCB_ *p;
+ struct tp_pcb *p;
{
-switch( (e->ev_number<<4)+(p->tp_state) ) {
-case 0x12:
- if ( p->tp_retrans > 0 ) return 0x1e;
- else return 0x1f;
-case 0x13:
- if ( p->tp_retrans > 0 ) return 0x2f;
- else return 0x30;
-case 0x14:
- if ( p->tp_retrans > 0 ) return 0x32;
- else return 0x31;
-case 0x15:
- if ( p->tp_retrans > 0 ) return 0x34;
- else return 0x35;
-case 0x54:
- if (p->tp_rxtshift < TP_NRETRANS) return 0x33;
- else return 0x31;
-case 0x64:
- if (p->tp_class == TP_CLASS_0) return 0x1a;
- else return 0x1b;
-case 0x77:
- if ( p->tp_class == TP_CLASS_0) return 0xd;
- else return 0xe;
-case 0x86:
- if ( e->ev_union.EV_DR_TPDU.e_sref != 0 ) return 0x2;
- else return 0x3;
-case 0xa2:
- if (p->tp_class == TP_CLASS_0) return 0x1c;
- else return 0x1d;
-case 0xb2:
- if (p->tp_class == TP_CLASS_0) return 0x5;
- else return 0x0;
-case 0xb4:
- if ( tp_goodack(p, e->ev_union.EV_AK_TPDU.e_cdt, e->ev_union.EV_AK_TPDU.e_seq, e->ev_union.EV_AK_TPDU.e_subseq) ) return 0x3a;
- else return 0x3b;
-case 0xc3:
- if ( IN_RWINDOW( p, e->ev_union.EV_DT_TPDU.e_seq,
- p->tp_rcvnxt, SEQ(p, p->tp_rcvnxt + p->tp_lcredit)) ) return 0x21;
- else return 0x24;
-case 0xc4:
- if ( p->tp_class == TP_CLASS_0 ) return 0x22;
- else if ( IN_RWINDOW( p, e->ev_union.EV_DT_TPDU.e_seq,
- p->tp_rcvnxt, SEQ(p, p->tp_rcvnxt + p->tp_lcredit)) ) return 0x23;
- else return 0x25;
-case 0xd3:
- if (p->tp_Xrcvnxt == e->ev_union.EV_XPD_TPDU.e_seq) return 0x27;
- else return 0x2a;
-case 0xd4:
- if (p->tp_Xrcvnxt == e->ev_union.EV_XPD_TPDU.e_seq) return 0x27;
- else return 0x29;
-case 0xe4:
- if ( tp_goodXack(p, e->ev_union.EV_XAK_TPDU.e_seq) ) return 0x3c;
- else return 0x3d;
-case 0x102:
- if ( p->tp_class == TP_CLASS_0 ) return 0x2d;
- else return 0x2e;
-case 0x104:
- if ( p->tp_class == TP_CLASS_0 ) return 0x2d;
- else return 0x2e;
-case 0x144:
- if (p->tp_class == TP_CLASS_0) return 0x3f;
- else return 0x40;
-case 0x162:
- if (p->tp_class == TP_CLASS_0) return 0x2b;
- else return 0x2c;
-case 0x172:
- if ( p->tp_class != TP_CLASS_4 ) return 0x42;
- else return 0x46;
-case 0x174:
- if ( p->tp_class != TP_CLASS_4 ) return 0x42;
- else return 0x47;
-case 0x177:
- if ( p->tp_class != TP_CLASS_4 ) return 0x42;
- else return 0x43;
-case 0x188:
- if ( p->tp_class == TP_CLASS_0 ) return 0xf;
- else if (tp_emit(CC_TPDU_type, p, 0,0, MCPY(p->tp_ucddata, M_NOWAIT)) == 0) return 0x10;
- else return 0x11;
-default: return 0;
-} /* end switch */
-} /* _Xebec_index() */
-static int inx[26][9] = { {0,0,0,0,0,0,0,0,0,},
- {0x0,0x0,0x0,0x0,0x31,0x0,0x0,0x0,0x0, },
- {0x0,0x0,-1,-1,-1,-1,0x0,0x0,0x0, },
- {0x0,0x0,0x0,0x0,0x3e,0x0,0x0,0x0,0x0, },
- {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, },
- {0x0,0x0,0x0,0x0,0x0,0x0,0x36,0x0,0x0, },
- {0x0,0x0,0x0,0x0,-1,0x0,0x0,0x0,0x0, },
- {0x0,0x7,0x15,0x1b,-1,0x17,0x3,0xa,0x0, },
- {0x0,0x19,0x6,0x20,0x37,0x8,0x3,-1,0x0, },
- {0x0,0x14,0x13,0x13,0x13,0x16,-1,0xa,0x0, },
- {0x0,0x7,0x6,0x1,0x9,0x18,0x3,0xa,0x0, },
- {0x0,0x19,-1,0x1,0x37,0x8,0x3,0xa,0x0, },
- {0x0,0x7,-1,0x26,-1,0x8,0x3,0xa,0x0, },
- {0x0,0x7,0x6,-1,-1,0x8,0x3,0xa,0x0, },
- {0x0,0x7,0x6,-1,-1,0x8,0x3,0xa,0x0, },
- {0x0,0x7,0x6,0x1,-1,0x8,0x3,0xa,0x0, },
- {0x0,0x12,0x0,0x0,0x0,0x0,0x0,0x0,0x0, },
- {0x0,0x0,-1,0x2e,-1,0x0,0x4,0x0,0x2e, },
- {0x0,0xb,0x0,0x0,0x0,0x0,0x0,0x0,0x0, },
- {0x0,0x0,0x0,0x0,0x38,0x0,0x0,0x0,0x0, },
- {0x0,0x0,0x0,0x0,0x39,0x0,0x0,0x0,0x0, },
- {0x0,0x0,0x0,0x0,-1,0x0,0x41,0x0,0x0, },
- {0x0,0x0,0x0,0x0,0x28,0x0,0x41,0x0,0x0, },
- {0x0,0xc,-1,0x2c,0x0,0x2c,0x4,0xc,0x2c, },
- {0x0,0x49,-1,0x45,-1,0x44,0x48,-1,0x0, },
- {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,-1, },
+ switch ((e->ev_number << 4) + (p->tp_state)) {
+ case 0x12:
+ if (p->tp_retrans > 0)
+ return 0x1e;
+ else
+ return 0x1f;
+ case 0x13:
+ if (p->tp_retrans > 0)
+ return 0x2f;
+ else
+ return 0x30;
+ case 0x14:
+ if (p->tp_retrans > 0)
+ return 0x32;
+ else
+ return 0x31;
+ case 0x15:
+ if (p->tp_retrans > 0)
+ return 0x34;
+ else
+ return 0x35;
+ case 0x54:
+ if (p->tp_rxtshift < TP_NRETRANS)
+ return 0x33;
+ else
+ return 0x31;
+ case 0x64:
+ if (p->tp_class == TP_CLASS_0)
+ return 0x1a;
+ else
+ return 0x1b;
+ case 0x77:
+ if (p->tp_class == TP_CLASS_0)
+ return 0xd;
+ else
+ return 0xe;
+ case 0x86:
+ if (e->ev_union.EV_DR_TPDU.e_sref != 0)
+ return 0x2;
+ else
+ return 0x3;
+ case 0xa2:
+ if (p->tp_class == TP_CLASS_0)
+ return 0x1c;
+ else
+ return 0x1d;
+ case 0xb2:
+ if (p->tp_class == TP_CLASS_0)
+ return 0x5;
+ else
+ return 0x0;
+ case 0xb4:
+ if (tp_goodack(p, e->ev_union.EV_AK_TPDU.e_cdt, e->ev_union.EV_AK_TPDU.e_seq, e->ev_union.EV_AK_TPDU.e_subseq))
+ return 0x3a;
+ else
+ return 0x3b;
+ case 0xc3:
+ if (IN_RWINDOW(p, e->ev_union.EV_DT_TPDU.e_seq,
+ p->tp_rcvnxt, SEQ(p, p->tp_rcvnxt + p->tp_lcredit)))
+ return 0x21;
+ else
+ return 0x24;
+ case 0xc4:
+ if (p->tp_class == TP_CLASS_0)
+ return 0x22;
+ else if (IN_RWINDOW(p, e->ev_union.EV_DT_TPDU.e_seq,
+ p->tp_rcvnxt, SEQ(p, p->tp_rcvnxt + p->tp_lcredit)))
+ return 0x23;
+ else
+ return 0x25;
+ case 0xd3:
+ if (p->tp_Xrcvnxt == e->ev_union.EV_XPD_TPDU.e_seq)
+ return 0x27;
+ else
+ return 0x2a;
+ case 0xd4:
+ if (p->tp_Xrcvnxt == e->ev_union.EV_XPD_TPDU.e_seq)
+ return 0x27;
+ else
+ return 0x29;
+ case 0xe4:
+ if (tp_goodXack(p, e->ev_union.EV_XAK_TPDU.e_seq))
+ return 0x3c;
+ else
+ return 0x3d;
+ case 0x102:
+ if (p->tp_class == TP_CLASS_0)
+ return 0x2d;
+ else
+ return 0x2e;
+ case 0x104:
+ if (p->tp_class == TP_CLASS_0)
+ return 0x2d;
+ else
+ return 0x2e;
+ case 0x144:
+ if (p->tp_class == TP_CLASS_0)
+ return 0x3f;
+ else
+ return 0x40;
+ case 0x162:
+ if (p->tp_class == TP_CLASS_0)
+ return 0x2b;
+ else
+ return 0x2c;
+ case 0x172:
+ if (p->tp_class != TP_CLASS_4)
+ return 0x42;
+ else
+ return 0x46;
+ case 0x174:
+ if (p->tp_class != TP_CLASS_4)
+ return 0x42;
+ else
+ return 0x47;
+ case 0x177:
+ if (p->tp_class != TP_CLASS_4)
+ return 0x42;
+ else
+ return 0x43;
+ case 0x188:
+ if (p->tp_class == TP_CLASS_0)
+ return 0xf;
+ else if (tp_emit(CC_TPDU_type, p, 0, 0, MCPY(p->tp_ucddata, M_NOWAIT)) == 0)
+ return 0x10;
+ else
+ return 0x11;
+ default:
+ return 0;
+ } /* end switch */
+} /* _Xebec_index() */
+static int inx[26][9] =
+{
+ {0, 0, 0, 0, 0, 0, 0, 0, 0,},
+ {0x0, 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, 0x0,},
+ {0x0, 0x0, -1, -1, -1, -1, 0x0, 0x0, 0x0,},
+ {0x0, 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x0, 0x0,},
+ {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,},
+ {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, 0x0, 0x0,},
+ {0x0, 0x0, 0x0, 0x0, -1, 0x0, 0x0, 0x0, 0x0,},
+ {0x0, 0x7, 0x15, 0x1b, -1, 0x17, 0x3, 0xa, 0x0,},
+ {0x0, 0x19, 0x6, 0x20, 0x37, 0x8, 0x3, -1, 0x0,},
+ {0x0, 0x14, 0x13, 0x13, 0x13, 0x16, -1, 0xa, 0x0,},
+ {0x0, 0x7, 0x6, 0x1, 0x9, 0x18, 0x3, 0xa, 0x0,},
+ {0x0, 0x19, -1, 0x1, 0x37, 0x8, 0x3, 0xa, 0x0,},
+ {0x0, 0x7, -1, 0x26, -1, 0x8, 0x3, 0xa, 0x0,},
+ {0x0, 0x7, 0x6, -1, -1, 0x8, 0x3, 0xa, 0x0,},
+ {0x0, 0x7, 0x6, -1, -1, 0x8, 0x3, 0xa, 0x0,},
+ {0x0, 0x7, 0x6, 0x1, -1, 0x8, 0x3, 0xa, 0x0,},
+ {0x0, 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,},
+ {0x0, 0x0, -1, 0x2e, -1, 0x0, 0x4, 0x0, 0x2e,},
+ {0x0, 0xb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,},
+ {0x0, 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x0,},
+ {0x0, 0x0, 0x0, 0x0, 0x39, 0x0, 0x0, 0x0, 0x0,},
+ {0x0, 0x0, 0x0, 0x0, -1, 0x0, 0x41, 0x0, 0x0,},
+ {0x0, 0x0, 0x0, 0x0, 0x28, 0x0, 0x41, 0x0, 0x0,},
+ {0x0, 0xc, -1, 0x2c, 0x0, 0x2c, 0x4, 0xc, 0x2c,},
+ {0x0, 0x49, -1, 0x45, -1, 0x44, 0x48, -1, 0x0,},
+ {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, -1,},
};
+int
tp_driver(p, e)
-register tp_PCB_ *p;
-register struct tp_event *e;
+ register struct tp_pcb *p;
+ register struct tp_event *e;
{
- register int index, error=0;
+ register int index, error = 0;
struct act_ent *a;
- static struct act_ent erroraction = {0,-1};
+ static struct act_ent erroraction = {0, -1};
index = inx[1 + e->ev_number][p->tp_state];
- if(index<0) index=_Xebec_index(e, p);
- if (index==0) {
+ if (index < 0)
+ index = _Xebec_index(e, p);
+ if (index == 0) {
a = &erroraction;
} else
a = &statetable[index];
- if(a->a_action)
- error = _Xebec_action( a->a_action, e, p );
- IFTRACE(D_DRIVER)
- tptrace(DRIVERTRACE, a->a_newstate, p->tp_state, e->ev_number, a->a_action, 0);
- ENDTRACE
- if(error==0)
- p->tp_state = a->a_newstate;
+ if (a->a_action)
+ error = _Xebec_action(a->a_action, e, p);
+#ifdef TPPT
+ if (tp_traceflag[D_DRIVER])
+ tptrace(DRIVERTRACE, a->a_newstate, p->tp_state,
+ e->ev_number, a->a_action, 0);
+#endif
+ if (error == 0)
+ p->tp_state = a->a_newstate;
return error;
}
-/* $NetBSD: tp_emit.c,v 1.6 1995/06/13 07:13:37 mycroft Exp $ */
+/* $OpenBSD: tp_emit.c,v 1.2 1996/03/04 10:35:56 mickey Exp $ */
+/* $NetBSD: tp_emit.c,v 1.7 1996/02/13 22:10:54 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
/*
* ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison
*/
-/*
- * This file contains tp_emit() and tp_error_emit(), which
- * form TPDUs and hand them to ip.
- * They take data in the form of mbuf chain, allocate mbufs as
- * necessary for headers, and set the fields as appropriate from
+/*
+ * This file contains tp_emit() and tp_error_emit(), which form TPDUs and
+ * hand them to ip. They take data in the form of mbuf chain, allocate mbufs
+ * as necessary for headers, and set the fields as appropriate from
* information found in the tpcb and net-level pcb.
*
- * The worst thing about this code is adding the variable-length
- * options on a machine that requires alignment for any memory access
- * that isn't of size 1. See the macro ADDOPTION() below.
+ * The worst thing about this code is adding the variable-length options on a
+ * machine that requires alignment for any memory access that isn't of size
+ * 1. See the macro ADDOPTION() below.
*
- * We don't do any concatenation. (There's a kludge to test the
- * basic mechanism of separation under the 'w' tpdebug option, that's all.)
+ * We don't do any concatenation. (There's a kludge to test the basic mechanism
+ * of separation under the 'w' tpdebug option, that's all.)
*/
#include <sys/param.h>
#include <sys/errno.h>
#include <sys/time.h>
+#include <net/if.h>
+
#include <netiso/iso.h>
#include <netiso/iso_pcb.h>
#include <netiso/argo_debug.h>
#include <netiso/tp_trace.h>
#include <netiso/tp_meas.h>
#include <netiso/tp_seq.h>
+#include <netiso/tp_var.h>
#include <netiso/iso_errno.h>
+#include <netiso/iso_var.h>
-#include <net/if.h>
#ifdef TRUE
#undef FALSE
#undef TRUE
#include <netccitt/pk.h>
#include <netccitt/pk_var.h>
-void iso_gen_csum();
-
-
-/* Here is a mighty kludge. The token ring misorders packets if you
- * fire them at it too fast, and TP sans checksum is "too fast", so
- * we have introduced a delay when checksumming isn't used.
+/*
+ * Here is a mighty kludge. The token ring misorders packets if you fire
+ * them at it too fast, and TP sans checksum is "too fast", so we have
+ * introduced a delay when checksumming isn't used.
*/
-char tp_delay = 0x00; /* delay to keep token ring from blowing it */
+char tp_delay = 0x00;/* delay to keep token ring from blowing it */
/*
* NAME: tp_emit()
* For DR and ER tpdus, the argument (eot) is
* the reason for issuing the tpdu rather than an end-of-tsdu indicator.
*
- * RETURNS:
+ * RETURNS:
* 0 OK
- * ENOBUFS
- * E* returned from net layer output rtn
+ * ENOBUFS
+ * E* returned from net layer output rtn
+ *
+ * SIDE EFFECTS:
*
- * SIDE EFFECTS:
+ * NOTES:
*
- * NOTES:
- *
- * WE ASSUME that the tp header + all options will fit in ONE mbuf.
+ * WE ASSUME that the tp header + all options will fit in ONE mbuf.
* If mbufs are 256 this will most likely be true, but if they are 128 it's
- * possible that they won't.
- * If you used every option on the CR + max. user data you'd overrun
+ * possible that they won't.
+ * If you used every option on the CR + max. user data you'd overrun
* 112 but unless you used > 115 bytes for the security
* parameter, it would fit in a 256-byte mbuf (240 bytes for the header)
* We don't support the security parameter, so this isn't a problem.
*/
int
-tp_emit(dutype, tpcb, seq, eot, data)
- int dutype;
- struct tp_pcb *tpcb;
- SeqNum seq;
- u_int eot;
- struct mbuf *data;
+tp_emit(dutype, tpcb, seq, eot, data)
+ int dutype;
+ struct tp_pcb *tpcb;
+ SeqNum seq;
+ u_int eot;
+ struct mbuf *data;
{
- register struct tpdu *hdr;
+ register struct tpdu *hdr;
register struct mbuf *m;
- int csum_offset=0;
- int datalen = 0;
- int error = 0;
- SeqNum olduwe;
- int acking_ooo;
-
- /* NOTE:
- * here we treat tpdu_li as if it DID include the li field, up until
- * the end, at which time we subtract 1
- * THis is because if we subtract 1 right away, we end up adding
- * one every time we add an option.
+ int csum_offset = 0;
+ int datalen = 0;
+ int error = 0;
+ SeqNum olduwe;
+ int acking_ooo;
+
+ /*
+ * NOTE: here we treat tpdu_li as if it DID include the li field, up
+ * until the end, at which time we subtract 1 THis is because if we
+ * subtract 1 right away, we end up adding one every time we add an
+ * option.
*/
- IFDEBUG(D_EMIT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_EMIT]) {
printf(
- "tp_emit dutype 0x%x, tpcb 0x%x, eot 0x%x, seq 0x%x, data 0x%x",
- dutype, tpcb, eot, seq, data);
- ENDDEBUG
+ "tp_emit dutype 0x%x, tpcb 0x%x, eot 0x%x, seq 0x%x, data 0x%x",
+ dutype, tpcb, eot, seq, data);
+ }
+#endif
if (dutype == CR_TPDU || dutype == CC_TPDU) {
- m = (struct mbuf *) malloc((u_long)256, M_MBUF, M_DONTWAIT);
+ m = (struct mbuf *) malloc((u_long) 256, M_MBUF, M_DONTWAIT);
if (m) {
m->m_type = TPMT_TPHDR;
mbstat.m_mtypes[TPMT_TPHDR]++;
m->m_flags = M_PKTHDR;
}
} else {
- MGETHDR(m, M_DONTWAIT, TPMT_TPHDR);
+ MGETHDR(m, M_DONTWAIT, TPMT_TPHDR);
}
m->m_data += max_hdr;
if (m == NULL) {
- if(data != (struct mbuf *)0)
+ if (data != (struct mbuf *) 0)
m_freem(data);
error = ENOBUFS;
goto done;
m->m_act = MNULL;
hdr = mtod(m, struct tpdu *);
- bzero((caddr_t)hdr, sizeof(struct tpdu));
+ bzero((caddr_t) hdr, sizeof(struct tpdu));
{
- int tp_headersize();
-
hdr->tpdu_type = dutype;
- hdr->tpdu_li = tp_headersize(dutype, tpcb);
+ hdr->tpdu_li = tp_headersize(dutype, tpcb);
/*
* class 0 doesn't use this for DT
- * it'll just get overwritten below
+ * it'll just get overwritten below
*/
- hdr->tpdu_dref = htons(tpcb->tp_fref);
- if( tpcb->tp_use_checksum ||
- (dutype == CR_TPDU_type && (tpcb->tp_class & TP_CLASS_4) )) {
- csum_offset = hdr->tpdu_li + 2; /* DOESN'T include csum */
- ADDOPTION(TPP_checksum, hdr, 2, eot /* dummy arg */);
- IFDEBUG(D_CHKSUM)
+ hdr->tpdu_dref = htons(tpcb->tp_fref);
+ if (tpcb->tp_use_checksum ||
+ (dutype == CR_TPDU_type && (tpcb->tp_class & TP_CLASS_4))) {
+ csum_offset = hdr->tpdu_li + 2; /* DOESN'T include csum */
+ ADDOPTION(TPP_checksum, hdr, 2, eot /* dummy arg */ );
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CHKSUM]) {
printf(
- "tp_emit: csum_offset 0x%x, hdr->tpdu_li 0x%x\n",
- csum_offset, hdr->tpdu_li);
- ENDDEBUG
- }
+ "tp_emit: csum_offset 0x%x, hdr->tpdu_li 0x%x\n",
+ csum_offset, hdr->tpdu_li);
+ }
+#endif
+ }
/*
* VARIABLE PARTS...
*/
- switch( dutype ) {
+ switch (dutype) {
case CR_TPDU_type:
hdr->tpdu_CRdref_0 = 0; /* must be zero */
- case CC_TPDU_type:
+ case CC_TPDU_type:
if (!tpcb->tp_cebit_off) {
tpcb->tp_win_recv = tp_start_win << 8;
LOCAL_CREDIT(tpcb);
} else
LOCAL_CREDIT(tpcb);
-/* Case CC_TPDU_type used to be here */
- {
- u_char x;
+ /* Case CC_TPDU_type used to be here */
+ {
+ u_char x;
- hdr->tpdu_CCsref = htons(tpcb->tp_lref); /* same as CRsref */
+ hdr->tpdu_CCsref = htons(tpcb->tp_lref); /* same as CRsref */
- if( tpcb->tp_class > TP_CLASS_1 ) {
- tpcb->tp_sent_uwe = tpcb->tp_lcredit -1;
+ if (tpcb->tp_class > TP_CLASS_1) {
+ tpcb->tp_sent_uwe = tpcb->tp_lcredit - 1;
tpcb->tp_sent_rcvnxt = 1;
tpcb->tp_sent_lcdt = tpcb->tp_lcredit;
hdr->tpdu_cdt = tpcb->tp_lcredit;
} else {
#ifdef TPCONS
if (tpcb->tp_netservice == ISO_CONS) {
- struct isopcb *isop = (struct isopcb *)tpcb->tp_npcb;
- struct pklcd *lcp = (struct pklcd *)(isop->isop_chan);
+ struct isopcb *isop = (struct isopcb *) tpcb->tp_npcb;
+ struct pklcd *lcp = (struct pklcd *) (isop->isop_chan);
lcp->lcd_flags &= ~X25_DG_CIRCUIT;
}
#endif
hdr->tpdu_cdt = 0;
}
hdr->tpdu_CCclass = tp_mask_to_num(tpcb->tp_class);
- hdr->tpdu_CCoptions =
- (tpcb->tp_xtd_format? TPO_XTD_FMT:0) |
- (tpcb->tp_use_efc? TPO_USE_EFC:0);
-
- IFPERF(tpcb)
- u_char perf_meas = tpcb->tp_perf_on;
- ADDOPTION(TPP_perf_meas, hdr, sizeof(perf_meas), perf_meas);
- ENDPERF
+ hdr->tpdu_CCoptions =
+ (tpcb->tp_xtd_format ? TPO_XTD_FMT : 0) |
+ (tpcb->tp_use_efc ? TPO_USE_EFC : 0);
+
+#ifdef TP_PERF_MEAS
+ if (DOPERF(tpcb)) {
+ u_char perf_meas = tpcb->tp_perf_on;
+ ADDOPTION(TPP_perf_meas, hdr,
+ sizeof(perf_meas), perf_meas);
+ }
+#endif
- if( dutype == CR_TPDU_type ) {
+ if (dutype == CR_TPDU_type) {
IncStat(ts_CR_sent);
- ASSERT( tpcb->tp_lsuffixlen > 0 );
- ASSERT( tpcb->tp_fsuffixlen > 0 );
+ ASSERT(tpcb->tp_lsuffixlen > 0);
+ ASSERT(tpcb->tp_fsuffixlen > 0);
ADDOPTION(TPP_calling_sufx, hdr,
- tpcb->tp_lsuffixlen, tpcb->tp_lsuffix[0]);
+ tpcb->tp_lsuffixlen, tpcb->tp_lsuffix[0]);
ADDOPTION(TPP_called_sufx, hdr,
- tpcb->tp_fsuffixlen, tpcb->tp_fsuffix[0]);
+ tpcb->tp_fsuffixlen, tpcb->tp_fsuffix[0]);
} else {
IncStat(ts_CC_sent);
}
- ADDOPTION(TPP_tpdu_size, hdr,
- sizeof(tpcb->tp_tpdusize), tpcb->tp_tpdusize);
+ ADDOPTION(TPP_tpdu_size, hdr,
+ sizeof(tpcb->tp_tpdusize), tpcb->tp_tpdusize);
if (tpcb->tp_class != TP_CLASS_0) {
- short millisec = 500*(tpcb->tp_sendack_ticks);
+ short millisec = 500 * (tpcb->tp_sendack_ticks);
millisec = htons(millisec);
ADDOPTION(TPP_acktime, hdr, sizeof(short), millisec);
- x = (tpcb->tp_use_nxpd? TPAO_USE_NXPD: 0)
- | (tpcb->tp_use_rcc? TPAO_USE_RCC : 0)
- | (tpcb->tp_use_checksum?0: TPAO_NO_CSUM)
- | (tpcb->tp_xpd_service? TPAO_USE_TXPD: 0);
+ x = (tpcb->tp_use_nxpd ? TPAO_USE_NXPD : 0)
+ | (tpcb->tp_use_rcc ? TPAO_USE_RCC : 0)
+ | (tpcb->tp_use_checksum ? 0 : TPAO_NO_CSUM)
+ | (tpcb->tp_xpd_service ? TPAO_USE_TXPD : 0);
ADDOPTION(TPP_addl_opt, hdr, 1, x);
if ((tpcb->tp_l_tpdusize ^ (1 << tpcb->tp_tpdusize)) != 0) {
- u_short size_s = tpcb->tp_l_tpdusize >> 7;
- u_char size_c = size_s;
+ u_short size_s = tpcb->tp_l_tpdusize >> 7;
+ u_char size_c = size_s;
ASSERT(tpcb->tp_l_tpdusize < 65536 * 128);
if (dutype == CR_TPDU_type)
tpcb->tp_ptpdusize = size_s;
}
}
}
-
- if( (dutype == CR_TPDU_type) && (tpcb->tp_class != TP_CLASS_0)){
+ if ((dutype == CR_TPDU_type) && (tpcb->tp_class != TP_CLASS_0)) {
- ASSERT( 1 == sizeof(tpcb->tp_vers) );
+ ASSERT(1 == sizeof(tpcb->tp_vers));
ADDOPTION(TPP_vers, hdr, 1, tpcb->tp_vers);
- /* for each alt protocol class x,
- * x = x<<4;
- * option = concat(option, x);
- * Well, for now we only have TP0 for an
- * alternative so... this is easy.
+ /*
+ * for each alt protocol class x, x =
+ * x<<4; option = concat(option, x);
+ * Well, for now we only have TP0 for
+ * an alternative so... this is easy.
*
- * HOWEVER... There should be NO alt protocol
- * class over CLNS. Need to see if the route suggests
- * CONS, and iff so add alt class.
+ * HOWEVER... There should be NO alt
+ * protocol class over CLNS. Need to
+ * see if the route suggests CONS,
+ * and iff so add alt class.
*/
x = 0;
ADDOPTION(TPP_alt_class, hdr, 1, x);
}
-
- if( hdr->tpdu_li > MLEN)
+ if (hdr->tpdu_li > MLEN)
panic("tp_emit CR/CC");
}
break;
case DR_TPDU_type:
- if( hdr->tpdu_DRdref == 0 ) {
+ if (hdr->tpdu_DRdref == 0) {
/* don't issue the DR */
goto done;
}
hdr->tpdu_cdt = 0;
hdr->tpdu_DRsref = htons(tpcb->tp_lref);
- hdr->tpdu_DRreason = (u_char)eot; /* WHICH BYTE OF THIS??? */
+ hdr->tpdu_DRreason = (u_char) eot; /* WHICH BYTE OF THIS??? */
/* forget the add'l information variable part */
IncStat(ts_DR_sent);
break;
- case DC_TPDU_type: /* not used in class 0 */
- ASSERT( tpcb->tp_class != TP_CLASS_0);
- hdr->tpdu_DCsref = htons(tpcb->tp_lref);
+ case DC_TPDU_type: /* not used in class 0 */
+ ASSERT(tpcb->tp_class != TP_CLASS_0);
+ hdr->tpdu_DCsref = htons(tpcb->tp_lref);
hdr->tpdu_cdt = 0;
- data = (struct mbuf *)0;
+ data = (struct mbuf *) 0;
IncStat(ts_DC_sent);
break;
- case XAK_TPDU_type: /* xak not used in class 0 */
- ASSERT( tpcb->tp_class != TP_CLASS_0); /* fall through */
+ case XAK_TPDU_type: /* xak not used in class 0 */
+ ASSERT(tpcb->tp_class != TP_CLASS_0); /* fall through */
hdr->tpdu_cdt = 0;
- IFTRACE(D_XPD)
+#ifdef TPPT
+ if (tp_traceflags[D_XPD]) {
tptraceTPCB(TPPTXack, seq, 0, 0, 0, 0);
- ENDTRACE
- data = (struct mbuf *)0;
+ }
+#endif
+ data = (struct mbuf *) 0;
if (tpcb->tp_xtd_format) {
#ifdef BYTE_ORDER
- union seq_type seqeotX;
+ union seq_type seqeotX;
seqeotX.s_seq = seq;
seqeotX.s_eot = 1;
hdr->tpdu_seqeotX = htonl(seqeotX.s_seqeot);
#else
hdr->tpdu_XAKseqX = seq;
-#endif /* BYTE_ORDER */
+#endif /* BYTE_ORDER */
} else {
hdr->tpdu_XAKseq = seq;
}
IncPStat(tpcb, tps_XAK_sent);
break;
- case XPD_TPDU_type: /* xpd not used in class 0 */
- ASSERT( tpcb->tp_class != TP_CLASS_0); /* fall through */
+ case XPD_TPDU_type: /* xpd not used in class 0 */
+ ASSERT(tpcb->tp_class != TP_CLASS_0); /* fall through */
hdr->tpdu_cdt = 0;
if (tpcb->tp_xtd_format) {
#ifdef BYTE_ORDER
- union seq_type seqeotX;
+ union seq_type seqeotX;
seqeotX.s_seq = seq;
seqeotX.s_eot = 1;
hdr->tpdu_seqeotX = htonl(seqeotX.s_seqeot);
#else
hdr->tpdu_XPDseqX = seq;
- hdr->tpdu_XPDeotX = 1; /* always 1 for XPD tpdu */
-#endif /* BYTE_ORDER */
+ hdr->tpdu_XPDeotX = 1; /* always 1 for XPD tpdu */
+#endif /* BYTE_ORDER */
} else {
hdr->tpdu_XPDseq = seq;
- hdr->tpdu_XPDeot = 1; /* always 1 for XPD tpdu */
+ hdr->tpdu_XPDeot = 1; /* always 1 for XPD tpdu */
}
IncStat(ts_XPD_sent);
IncPStat(tpcb, tps_XPD_sent);
/* kludge to test the input size checking */
- IFDEBUG(D_SIZE_CHECK)
- /*if(data->m_len <= 16 && data->m_off < (MLEN-18) ) {
- printf("Sending too much data on XPD: 18 bytes\n");
- data->m_len = 18;
- }*/
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_SIZE_CHECK]) {
+ /*
+ * if(data->m_len <= 16 && data->m_off < (MLEN-18) )
+ * { printf("Sending too much data on XPD: 18
+ * bytes\n"); data->m_len = 18; }
+ */
+ }
+#endif
break;
case DT_TPDU_type:
hdr->tpdu_cdt = 0;
- IFTRACE(D_DATA)
- tptraceTPCB(TPPTmisc, "emit DT: eot seq tpdu_li", eot, seq,
- hdr->tpdu_li, 0);
- ENDTRACE
+#ifdef TPPT
+ if (tp_traceflags[D_DATA]) {
+ tptraceTPCB(TPPTmisc,
+ "emit DT: eot seq tpdu_li", eot,
+ seq, hdr->tpdu_li, 0);
+ }
+#endif
if (tpcb->tp_xtd_format) {
#ifdef BYTE_ORDER
- union seq_type seqeotX;
+ union seq_type seqeotX;
seqeotX.s_seq = seq;
seqeotX.s_eot = eot;
#else
hdr->tpdu_DTseqX = seq;
hdr->tpdu_DTeotX = eot;
-#endif /* BYTE_ORDER */
+#endif /* BYTE_ORDER */
} else if (tpcb->tp_class == TP_CLASS_0) {
- IFDEBUG(D_EMIT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_EMIT]) {
printf("DT tpdu: class 0 m 0x%x hdr 0x%x\n", m, hdr);
- dump_buf( hdr, hdr->tpdu_li + 1 );
- ENDDEBUG
- ((struct tp0du *)hdr)->tp0du_eot = eot;
- ((struct tp0du *)hdr)->tp0du_mbz = 0;
- IFDEBUG(D_EMIT)
+ dump_buf(hdr, hdr->tpdu_li + 1);
+ }
+#endif
+ ((struct tp0du *) hdr)->tp0du_eot = eot;
+ ((struct tp0du *) hdr)->tp0du_mbz = 0;
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_EMIT]) {
printf("DT 2 tpdu: class 0 m 0x%x hdr 0x%x\n", m, hdr);
- dump_buf( hdr, hdr->tpdu_li + 1 );
- ENDDEBUG
+ dump_buf(hdr, hdr->tpdu_li + 1);
+ }
+#endif
} else {
hdr->tpdu_DTseq = seq;
hdr->tpdu_DTeot = eot;
}
- if(eot) {
+ if (eot) {
IncStat(ts_EOT_sent);
}
IncStat(ts_DT_sent);
IncPStat(tpcb, tps_DT_sent);
break;
- case AK_TPDU_type:/* ak not used in class 0 */
- ASSERT( tpcb->tp_class != TP_CLASS_0);
- data = (struct mbuf *)0;
+ case AK_TPDU_type: /* ak not used in class 0 */
+ ASSERT(tpcb->tp_class != TP_CLASS_0);
+ data = (struct mbuf *) 0;
olduwe = tpcb->tp_sent_uwe;
if (seq != tpcb->tp_sent_rcvnxt || tpcb->tp_rsycnt == 0) {
- LOCAL_CREDIT( tpcb );
- tpcb->tp_sent_uwe =
- SEQ(tpcb,tpcb->tp_rcvnxt + tpcb->tp_lcredit -1);
+ LOCAL_CREDIT(tpcb);
+ tpcb->tp_sent_uwe =
+ SEQ(tpcb, tpcb->tp_rcvnxt + tpcb->tp_lcredit - 1);
tpcb->tp_sent_lcdt = tpcb->tp_lcredit;
acking_ooo = 0;
} else
acking_ooo = 1;
- IFDEBUG(D_RENEG)
- /* occasionally fake a reneging so
- you can test subsequencing */
- if( olduwe & 0x1 ) {
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_RENEG]) {
+ /*
+ * occasionally fake a reneging so you can test
+ * subsequencing
+ */
+ if (olduwe & 0x1) {
tpcb->tp_reneged = 1;
IncStat(ts_ldebug);
}
- ENDDEBUG
- /* Are we about to reneg on credit?
- * When might we do so?
- * a) when using optimistic credit (which we no longer do).
- * b) when drain() gets implemented (not in the plans).
- * c) when D_RENEG is on.
- * d) when DEC BIT response is implemented.
- * (not- when we do this, we'll need to implement flow control
- * confirmation)
+ }
+#endif
+ /*
+ * Are we about to reneg on credit? When might we do
+ * so? a) when using optimistic credit (which we no
+ * longer do). b) when drain() gets implemented (not
+ * in the plans). c) when D_RENEG is on. d) when DEC
+ * BIT response is implemented. (not- when we do
+ * this, we'll need to implement flow control
+ * confirmation)
*/
- if( SEQ_LT(tpcb, tpcb->tp_sent_uwe, olduwe) ) {
+ if (SEQ_LT(tpcb, tpcb->tp_sent_uwe, olduwe)) {
tpcb->tp_reneged = 1;
IncStat(ts_lcdt_reduced);
- IFTRACE(D_CREDIT)
- tptraceTPCB(TPPTmisc,
- "RENEG: olduwe newuwe lcredit rcvnxt",
- olduwe,
- tpcb->tp_sent_uwe, tpcb->tp_lcredit,
- tpcb->tp_rcvnxt);
- ENDTRACE
+#ifdef TPPT
+ if (tp_traceflags[D_CREDIT]) {
+ tptraceTPCB(TPPTmisc,
+ "RENEG: olduwe newuwe lcredit rcvnxt",
+ olduwe,
+ tpcb->tp_sent_uwe, tpcb->tp_lcredit,
+ tpcb->tp_rcvnxt);
+ }
+#endif
}
- IFPERF(tpcb)
- /* new lwe is less than old uwe means we're
+#ifdef TP_PERF_MEAS
+ if (DOPERF(tpcb)) {
+ /*
+ * new lwe is less than old uwe means we're
* acking before we received a whole window full
*/
- if( SEQ_LT( tpcb, tpcb->tp_rcvnxt, olduwe) ) {
- /* tmp1 = number of pkts fewer than the full window */
- register int tmp1 =
- (int) SEQ_SUB( tpcb, olduwe, tpcb->tp_rcvnxt);
+ if (SEQ_LT(tpcb, tpcb->tp_rcvnxt, olduwe)) {
+ /*
+ * tmp1 = number of pkts fewer than
+ * the full window
+ */
+ register int tmp1 =
+ (int) SEQ_SUB(tpcb, olduwe,
+ tpcb->tp_rcvnxt);
- if(tmp1 > TP_PM_MAX)
+ if (tmp1 > TP_PM_MAX)
tmp1 = TP_PM_MAX;
- IncPStat( tpcb, tps_ack_early[tmp1] );
+ IncPStat(tpcb, tps_ack_early[tmp1]);
- /* tmp1 = amt of new cdt we're advertising */
- tmp1 = SEQ_SUB( tpcb, seq, tpcb->tp_sent_rcvnxt);
- if(tmp1 > TP_PM_MAX )
+ /*
+ * tmp1 = amt of new cdt we're
+ * advertising
+ */
+ tmp1 = SEQ_SUB(tpcb, seq,
+ tpcb->tp_sent_rcvnxt);
+ if (tmp1 > TP_PM_MAX)
tmp1 = TP_PM_MAX;
- IncPStat( tpcb,
- tps_cdt_acked [ tmp1 ]
- [ ((tpcb->tp_lcredit > TP_PM_MAX)?
- TP_PM_MAX:tpcb->tp_lcredit) ] );
+ IncPStat(tpcb,
+ tps_cdt_acked[tmp1]
+ [((tpcb->tp_lcredit >
+ TP_PM_MAX) ?
+ TP_PM_MAX :
+ tpcb->tp_lcredit)]);
}
- ENDPERF
+ }
+#endif
- IFTRACE(D_ACKSEND)
- tptraceTPCB(TPPTack, seq, tpcb->tp_lcredit, tpcb->tp_sent_uwe,
- tpcb->tp_r_subseq, 0);
- ENDTRACE
+#ifdef TPPT
+ if (tp_traceflags[D_ACKSEND]) {
+ tptraceTPCB(TPPTack, seq, tpcb->tp_lcredit,
+ tpcb->tp_sent_uwe,
+ tpcb->tp_r_subseq, 0);
+ }
+#endif
if (tpcb->tp_xtd_format) {
#ifdef BYTE_ORDER
- union seq_type seqeotX;
+ union seq_type seqeotX;
seqeotX.s_seq = seq;
seqeotX.s_eot = 0;
hdr->tpdu_seqeotX = htonl(seqeotX.s_seqeot);
hdr->tpdu_AKcdtX = htons(tpcb->tp_lcredit);
#else
- hdr->tpdu_cdt = 0;
+ hdr->tpdu_cdt = 0;
hdr->tpdu_AKseqX = seq;
hdr->tpdu_AKcdtX = tpcb->tp_lcredit;
-#endif /* BYTE_ORDER */
+#endif /* BYTE_ORDER */
} else {
hdr->tpdu_AKseq = seq;
hdr->tpdu_AKcdt = tpcb->tp_lcredit;
}
if ((tpcb->tp_class == TP_CLASS_4) &&
- (tpcb->tp_reneged || acking_ooo)) {
- /*
- * Ack subsequence parameter req'd if WE reneged on
- * credit offered. (ISO 8073, 12.2.3.8.2, p. 74)
+ (tpcb->tp_reneged || acking_ooo)) {
+ /*
+ * Ack subsequence parameter req'd if WE
+ * reneged on credit offered. (ISO 8073,
+ * 12.2.3.8.2, p. 74)
*/
- IFDEBUG(D_RENEG)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_RENEG]) {
printf("Adding subseq 0x%x\n", tpcb->tp_s_subseq);
- ENDDEBUG
+ }
+#endif
tpcb->tp_s_subseq++;
/*
* add tmp subseq and do a htons on it.
*/
- ADDOPTION(TPP_subseq, hdr,
- sizeof(tpcb->tp_s_subseq), tpcb->tp_s_subseq);
+ ADDOPTION(TPP_subseq, hdr,
+ sizeof(tpcb->tp_s_subseq), tpcb->tp_s_subseq);
} else
tpcb->tp_s_subseq = 0;
- if ( tpcb->tp_sendfcc || eot ) /* overloaded to mean SEND FCC */ {
- /*
- * Rules for sending FCC ("should" send when) :
- * %a) received an ack from peer with NO NEWS whatsoever,
- * and it did not contain an FCC
- * b) received an ack from peer that opens its closed window.
- * c) received an ack from peer after it reneged on its
- * offered credit, AND this ack raises UWE but LWE is same
- * and below UWE at time of reneging (reduction)
- * Now, ISO 8073 12.2.3.8.3 says
- * that a retransmitted AK shall not contain the FCC
- * parameter. Now, how the hell you tell the difference
- * between a retransmitted ack and an ack that's sent in
- * response to a received ack, I don't know, because without
- * any local activity, and w/o any received DTs, they
- * will contain exactly the same credit/seq# information.
- * Anyway, given that the "retransmission of acks"
- * procedure (ISO 8073 12.2.3.8.3) is optional, and we
- * don't do it (although the peer can't tell that), we
- * ignore this last rule.
+ if (tpcb->tp_sendfcc || eot) { /* overloaded to mean
+ * SEND FCC */
+ /*
+ * Rules for sending FCC ("should" send when)
+ * : %a) received an ack from peer with NO
+ * NEWS whatsoever, and it did not contain an
+ * FCC b) received an ack from peer that
+ * opens its closed window. c) received an
+ * ack from peer after it reneged on its
+ * offered credit, AND this ack raises UWE
+ * but LWE is same and below UWE at time of
+ * reneging (reduction) Now, ISO 8073
+ * 12.2.3.8.3 says that a retransmitted AK
+ * shall not contain the FCC parameter. Now,
+ * how the hell you tell the difference
+ * between a retransmitted ack and an ack
+ * that's sent in response to a received ack,
+ * I don't know, because without any local
+ * activity, and w/o any received DTs, they
+ * will contain exactly the same credit/seq#
+ * information. Anyway, given that the
+ * "retransmission of acks" procedure (ISO
+ * 8073 12.2.3.8.3) is optional, and we don't
+ * do it (although the peer can't tell that),
+ * we ignore this last rule.
+ *
+ * We send FCC for reasons a) and b) only. To
+ * add reason c) would require a ridiculous
+ * amount of state.
*
- * We send FCC for reasons a) and b) only.
- * To add reason c) would require a ridiculous amount of state.
- *
*/
- u_short bogus[4]; /* lwe(32), subseq(16), cdt(16) */
- SeqNum lwe;
- u_short subseq, fcredit;
+ u_short bogus[4]; /* lwe(32), subseq(16),
+ * cdt(16) */
+ SeqNum lwe;
+ u_short subseq, fcredit;
tpcb->tp_sendfcc = 0;
subseq = htons(tpcb->tp_r_subseq);
fcredit = htons(tpcb->tp_fcredit);
- bcopy((caddr_t) &lwe, (caddr_t)&bogus[0], sizeof(SeqNum));
- bcopy((caddr_t) &subseq, (caddr_t)&bogus[2], sizeof(u_short));
- bcopy((caddr_t) &fcredit, (caddr_t)&bogus[3], sizeof(u_short));
+ bcopy((caddr_t) & lwe, (caddr_t) & bogus[0], sizeof(SeqNum));
+ bcopy((caddr_t) & subseq, (caddr_t) & bogus[2], sizeof(u_short));
+ bcopy((caddr_t) & fcredit, (caddr_t) & bogus[3], sizeof(u_short));
- IFTRACE(D_ACKSEND)
- tptraceTPCB(TPPTmisc,
- "emit w/FCC: snduna r_subseq fcredit",
- tpcb->tp_snduna, tpcb->tp_r_subseq,
- tpcb->tp_fcredit, 0);
- ENDTRACE
+#ifdef TPPT
+ if (tp_traceflags[D_ACKSEND]) {
+ tptraceTPCB(TPPTmisc,
+ "emit w/FCC: snduna r_subseq fcredit",
+ tpcb->tp_snduna, tpcb->tp_r_subseq,
+ tpcb->tp_fcredit, 0);
+ }
+#endif
- IFDEBUG(D_ACKSEND)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ACKSEND]) {
printf("Calling ADDOPTION 0x%x, 0x%x, 0x%x,0x%x\n",
- TPP_flow_cntl_conf,
- hdr, sizeof(bogus), bogus[0]);
- ENDDEBUG
+ TPP_flow_cntl_conf,
+ hdr, sizeof(bogus), bogus[0]);
+ }
+#endif
ADDOPTION(TPP_flow_cntl_conf, hdr, sizeof(bogus), bogus[0]);
- IFDEBUG(D_ACKSEND)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ACKSEND]) {
printf("after ADDOPTION hdr 0x%x hdr->tpdu_li 0x%x\n",
- hdr, hdr->tpdu_li);
+ hdr, hdr->tpdu_li);
printf(
- "after ADDOPTION csum_offset 0x%x, hdr->tpdu_li 0x%x\n",
- csum_offset, hdr->tpdu_li);
- ENDDEBUG
-
+ "after ADDOPTION csum_offset 0x%x, hdr->tpdu_li 0x%x\n",
+ csum_offset, hdr->tpdu_li);
+ }
+#endif
+
}
tpcb->tp_reneged = 0;
tpcb->tp_sent_rcvnxt = seq;
if (tpcb->tp_fcredit == 0) {
- int timo = tpcb->tp_keepalive_ticks;
+ int timo = tpcb->tp_keepalive_ticks;
if (tpcb->tp_rxtshift < TP_MAXRXTSHIFT)
tpcb->tp_rxtshift++;
- timo = min(timo, ((int)tpcb->tp_dt_ticks) << tpcb->tp_rxtshift);
+ timo = min(timo, ((int) tpcb->tp_dt_ticks) << tpcb->tp_rxtshift);
tp_ctimeout(tpcb, TM_sendack, timo);
} else
tp_ctimeout(tpcb, TM_sendack, tpcb->tp_keepalive_ticks);
IncStat(ts_AK_sent);
IncPStat(tpcb, tps_AK_sent);
- IFDEBUG(D_ACKSEND)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ACKSEND]) {
printf(
- "2 after rADDOPTION csum_offset 0x%x, hdr->tpdu_li 0x%x\n",
- csum_offset, hdr->tpdu_li);
- ENDDEBUG
+ "2 after rADDOPTION csum_offset 0x%x, hdr->tpdu_li 0x%x\n",
+ csum_offset, hdr->tpdu_li);
+ }
+#endif
break;
case ER_TPDU_type:
- hdr->tpdu_ERreason = eot;
+ hdr->tpdu_ERreason = eot;
hdr->tpdu_cdt = 0;
/* no user data */
- data = (struct mbuf *)0;
+ data = (struct mbuf *) 0;
IncStat(ts_ER_sent);
break;
}
}
- ASSERT( ((int)hdr->tpdu_li > 0) && ((int)hdr->tpdu_li < MLEN) );
+ ASSERT(((int) hdr->tpdu_li > 0) && ((int) hdr->tpdu_li < MLEN));
m->m_next = data;
- ASSERT( hdr->tpdu_li < MLEN ); /* leave this in */
- ASSERT( hdr->tpdu_li != 0 ); /* leave this in */
+ ASSERT(hdr->tpdu_li < MLEN); /* leave this in */
+ ASSERT(hdr->tpdu_li != 0); /* leave this in */
- m->m_len = hdr->tpdu_li ;
- hdr->tpdu_li --; /* doesn't include the li field */
+ m->m_len = hdr->tpdu_li;
+ hdr->tpdu_li--; /* doesn't include the li field */
- datalen = m_datalen( m ); /* total len */
+ datalen = m_datalen(m); /* total len */
- ASSERT( datalen <= tpcb->tp_l_tpdusize ); /* may become a problem
- when CLNP is used; leave in here for the time being */
- IFDEBUG(D_ACKSEND)
- printf(
- "4 after rADDOPTION csum_offset 0x%x, hdr->tpdu_li 0x%x\n",
- csum_offset, hdr->tpdu_li);
- ENDDEBUG
- if( datalen > tpcb->tp_l_tpdusize ) {
- printf("data len 0x%x tpcb->tp_l_tpdusize 0x%x\n",
- datalen, tpcb->tp_l_tpdusize);
+ ASSERT(datalen <= tpcb->tp_l_tpdusize); /* may become a problem when
+ * CLNP is used; leave in
+ * here for the time being */
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ACKSEND]) {
+ printf(
+ "4 after rADDOPTION csum_offset 0x%x, hdr->tpdu_li 0x%x\n",
+ csum_offset, hdr->tpdu_li);
}
- IFDEBUG(D_EMIT)
+#endif
+ if (datalen > tpcb->tp_l_tpdusize) {
+ printf("data len 0x%x tpcb->tp_l_tpdusize 0x%x\n",
+ datalen, tpcb->tp_l_tpdusize);
+ }
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_EMIT]) {
printf(
- "tp_emit before gen_csum m_len 0x%x, csum_offset 0x%x, datalen 0x%x\n",
- m->m_len, csum_offset, datalen);
- ENDDEBUG
- if( tpcb->tp_use_checksum ||
- (dutype == CR_TPDU_type && (tpcb->tp_class & TP_CLASS_4)) ) {
+ "tp_emit before gen_csum m_len 0x%x, csum_offset 0x%x, datalen 0x%x\n",
+ m->m_len, csum_offset, datalen);
+ }
+#endif
+ if (tpcb->tp_use_checksum ||
+ (dutype == CR_TPDU_type && (tpcb->tp_class & TP_CLASS_4))) {
iso_gen_csum(m, csum_offset, datalen);
}
-
- IFDEBUG(D_EMIT)
- printf("tp_emit before tpxxx_output tpcb 0x%x, dutype 0x%x, datalen 0x%x\n",
- tpcb, dutype, datalen);
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_EMIT]) {
+ printf("tp_emit before tpxxx_output tpcb 0x%x, dutype 0x%x, datalen 0x%x\n",
+ tpcb, dutype, datalen);
dump_buf(mtod(m, caddr_t), datalen);
- ENDDEBUG
+ }
+#endif
- IFPERF(tpcb)
- if( dutype == DT_TPDU_type ) {
+#ifdef TP_PERF_MEAS
+ if (DOPERF(tpcb)) {
+ if (dutype == DT_TPDU_type) {
PStat(tpcb, Nb_to_ll) += (datalen - m->m_len);
- tpmeas( tpcb->tp_lref, TPtime_to_ll, (struct timeval *)0,
- seq, PStat(tpcb, Nb_to_ll), (datalen - m->m_len));
+ tpmeas(tpcb->tp_lref, TPtime_to_ll, NULL,
+ seq, PStat(tpcb, Nb_to_ll),
+ (datalen - m->m_len));
}
- ENDPERF
+ }
+#endif
- IFTRACE(D_EMIT)
- tptraceTPCB(TPPTtpduout, dutype, hdr, hdr->tpdu_li+1, datalen, 0);
- ENDTRACE
- IFDEBUG(D_EMIT)
+#ifdef TPPT
+ if (tp_traceflags[D_EMIT]) {
+ tptraceTPCB(TPPTtpduout, dutype, hdr, hdr->tpdu_li + 1, datalen, 0);
+ }
+#endif
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_EMIT]) {
printf("OUTPUT: tpcb 0x%x, isop 0x%x, so 0x%x\n",
- tpcb, tpcb->tp_npcb, tpcb->tp_sock);
- ENDDEBUG
+ tpcb, tpcb->tp_npcb, tpcb->tp_sock);
+ }
+#endif
- { extern char tp_delay;
+ {
+ extern char tp_delay;
- if( tp_delay )
- if( tpcb->tp_use_checksum == 0 ) {
- register u_int i = tp_delay;
- for (; i!= 0; i--)
+ if (tp_delay)
+ if (tpcb->tp_use_checksum == 0) {
+ register u_int i = tp_delay;
+ for (; i != 0; i--)
(void) iso_check_csum(m, datalen);
}
}
- ASSERT( m->m_len > 0 );
- error = (tpcb->tp_nlproto->nlp_output)(tpcb->tp_npcb, m, datalen,
- !tpcb->tp_use_checksum);
- IFDEBUG(D_EMIT)
+ ASSERT(m->m_len > 0);
+ error = (tpcb->tp_nlproto->nlp_output) (m, datalen, tpcb->tp_npcb,
+ !tpcb->tp_use_checksum);
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_EMIT]) {
printf("OUTPUT: returned 0x%x\n", error);
- ENDDEBUG
- IFTRACE(D_EMIT)
- tptraceTPCB(TPPTmisc,
- "tp_emit nlproto->output netservice returns datalen",
- tpcb->tp_nlproto->nlp_output, tpcb->tp_netservice, error, datalen);
- ENDTRACE
+ }
+#endif
+#ifdef TPPT
+ if (tp_traceflags[D_EMIT]) {
+ tptraceTPCB(TPPTmisc,
+ "tp_emit nlproto->output netservice returns datalen",
+ tpcb->tp_nlproto->nlp_output, tpcb->tp_netservice, error, datalen);
+ }
+#endif
done:
if (error) {
if (dutype == AK_TPDU_type)
tp_ctimeout(tpcb, TM_sendack, 1);
if (error == E_CO_QFULL) {
- tp_quench(tpcb, PRC_QUENCH);
+ tp_quench((struct inpcb *) tpcb, PRC_QUENCH);
return 0;
}
}
/*
* NAME: tp_error_emit()
* CALLED FROM: tp_input() when a DR or ER is to be issued in
- * response to an input error.
+ * response to an input error.
* FUNCTION and ARGUMENTS:
- * The error type is the first argument.
- * The argument (sref) is the source reference on the bad incoming tpdu,
- * and is used for a destination reference on the outgoing packet.
- * (faddr) and (laddr) are the foreign and local addresses for this
- * connection.
- * (erdata) is a ptr to the errant incoming tpdu, and is copied into the
- * outgoing ER, if an ER is to be issued.
- * (erlen) is the number of octets of the errant tpdu that we should
- * try to copy.
- * (tpcb) is the pcb that describes the connection for which the bad tpdu
- * arrived.
+ * The error type is the first argument.
+ * The argument (sref) is the source reference on the bad incoming tpdu,
+ * and is used for a destination reference on the outgoing packet.
+ * (faddr) and (laddr) are the foreign and local addresses for this
+ * connection.
+ * (erdata) is a ptr to the errant incoming tpdu, and is copied into the
+ * outgoing ER, if an ER is to be issued.
+ * (erlen) is the number of octets of the errant tpdu that we should
+ * try to copy.
+ * (tpcb) is the pcb that describes the connection for which the bad tpdu
+ * arrived.
* RETURN VALUES:
* 0 OK
* ENOBUFS
* E* from net layer datagram output routine
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
*/
int
tp_error_emit(error, sref, faddr, laddr, erdata, erlen, tpcb, cons_channel,
- dgout_routine)
- int error;
- u_long sref;
+ dgout_routine)
+ int error;
+ u_long sref;
struct sockaddr_iso *faddr, *laddr;
- struct mbuf *erdata;
- int erlen;
- struct tp_pcb *tpcb;
- caddr_t cons_channel;
- int (*dgout_routine)();
+ struct mbuf *erdata;
+ int erlen;
+ struct tp_pcb *tpcb;
+ caddr_t cons_channel;
+ int (*dgout_routine) __P((struct mbuf *, ...));
{
- int dutype;
- int datalen = 0;
- register struct tpdu *hdr;
- register struct mbuf *m;
- int csum_offset;
-
- IFTRACE(D_ERROR_EMIT)
- tptrace(TPPTmisc, "tp_error_emit error sref tpcb erlen",
+ int dutype;
+ int datalen = 0;
+ register struct tpdu *hdr;
+ register struct mbuf *m;
+ int csum_offset;
+
+#ifdef TPPT
+ if (tp_traceflags[D_ERROR_EMIT]) {
+ tptrace(TPPTmisc, "tp_error_emit error sref tpcb erlen",
error, sref, tpcb, erlen);
- ENDTRACE
- IFDEBUG(D_ERROR_EMIT)
+ }
+#endif
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ERROR_EMIT]) {
printf(
- "tp_error_emit error 0x%x sref 0x%x tpcb 0x%x erlen 0x%x chan 0x%x\n",
- error, sref, tpcb, erlen, cons_channel);
- ENDDEBUG
+ "tp_error_emit error 0x%x sref 0x%x tpcb 0x%x erlen 0x%x chan 0x%x\n",
+ error, sref, tpcb, erlen, cons_channel);
+ }
+#endif
- MGET(m, M_DONTWAIT, TPMT_TPHDR);
+ MGET(m, M_DONTWAIT, TPMT_TPHDR);
if (m == NULL) {
return ENOBUFS;
}
hdr = mtod(m, struct tpdu *);
- IFDEBUG(D_ERROR_EMIT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ERROR_EMIT]) {
printf("[error 0x%x] [error&0xff 0x%x] [(char)error 0x%x]\n",
- error, error&0xff, (char)error);
- ENDDEBUG
+ error, error & 0xff, (char) error);
+ }
+#endif
if (error & TP_ERROR_SNDC)
hdr->tpdu_type = dutype;
hdr->tpdu_cdt = 0;
- switch( dutype ) {
+ switch (dutype) {
case DC_TPDU_type:
IncStat(ts_DC_sent);
hdr->tpdu_li = 6;
hdr->tpdu_DCdref = htons(sref);
hdr->tpdu_DCsref = tpcb ? htons(tpcb->tp_lref) : 0;
- IFDEBUG(D_ERROR_EMIT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ERROR_EMIT]) {
printf("DC case:\n");
- dump_buf( hdr, 6);
- ENDDEBUG
+ dump_buf(hdr, 6);
+ }
+#endif
/* forget the add'l information variable part */
break;
hdr->tpdu_li = 7;
hdr->tpdu_DRdref = htons(sref);
hdr->tpdu_DRsref = 0;
- hdr->tpdu_DRreason = (char)error;
- IFDEBUG(D_ERROR_EMIT)
+ hdr->tpdu_DRreason = (char) error;
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ERROR_EMIT]) {
printf("DR case:\n");
- dump_buf( hdr, 7);
- ENDDEBUG
+ dump_buf(hdr, 7);
+ }
+#endif
/* forget the add'l information variable part */
break;
case ER_TPDU_type:
IncStat(ts_ER_sent);
- hdr->tpdu_li = 5;
- hdr->tpdu_ERreason = (char)error;
+ hdr->tpdu_li = 5;
+ hdr->tpdu_ERreason = (char) error;
hdr->tpdu_ERdref = htons(sref);
break;
printf("TP PANIC: bad dutype 0x%x\n", dutype);
}
- if(tpcb)
- if( tpcb->tp_use_checksum ) {
- ADDOPTION(TPP_checksum, hdr, 2, csum_offset /* dummy argument */);
- csum_offset = hdr->tpdu_li - 2;
+ if (tpcb)
+ if (tpcb->tp_use_checksum) {
+ ADDOPTION(TPP_checksum, hdr, 2, csum_offset /* dummy argument */ );
+ csum_offset = hdr->tpdu_li - 2;
}
-
- ASSERT( hdr->tpdu_li < MLEN );
+ ASSERT(hdr->tpdu_li < MLEN);
if (dutype == ER_TPDU_type) {
/* copy the errant tpdu into another 'variable part' */
register caddr_t P;
- IFTRACE(D_ERROR_EMIT)
+#ifdef TPPT
+ if (tp_traceflags[D_ERROR_EMIT]) {
tptrace(TPPTmisc, "error_emit ER len tpduli", erlen, hdr->tpdu_li,
- 0,0);
- ENDTRACE
- IFDEBUG(D_ERROR_EMIT)
+ 0, 0);
+ }
+#endif
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ERROR_EMIT]) {
printf("error_emit ER len 0x%x tpduli 0x%x\n", erlen, hdr->tpdu_li);
- ENDDEBUG
+ }
+#endif
/* copy at most as many octets for which you have room */
if (erlen + hdr->tpdu_li + 2 > TP_MAX_HEADER_LEN)
erlen = TP_MAX_HEADER_LEN - hdr->tpdu_li - 2;
-
+
/* add the "invalid tpdu" parameter : required in class 0 */
- P = (caddr_t)hdr + (int)(hdr->tpdu_li);
- vbptr(P)->tpv_code = TPP_invalid_tpdu; /* parameter code */
+ P = (caddr_t) hdr + (int) (hdr->tpdu_li);
+ vbptr(P)->tpv_code = TPP_invalid_tpdu; /* parameter code */
vbptr(P)->tpv_len = erlen; /* parameter length */
- m->m_len = hdr->tpdu_li + 2; /* 1 for code, 1 for length */
+ m->m_len = hdr->tpdu_li + 2; /* 1 for code, 1 for length */
- /* tp_input very likely handed us an mbuf chain w/ nothing in
+ /*
+ * tp_input very likely handed us an mbuf chain w/ nothing in
* the first mbuf and the data following the empty mbuf
*/
- if(erdata->m_len == 0) {
- erdata = m_free(erdata); /* returns the next mbuf on the chain */
+ if (erdata->m_len == 0) {
+ erdata = m_free(erdata); /* returns the next mbuf
+ * on the chain */
}
/*
* copy only up to the bad octet
* (or max that will fit in a header
*/
m->m_next = m_copy(erdata, 0, erlen);
- hdr->tpdu_li += erlen + 2;
+ hdr->tpdu_li += erlen + 2;
m_freem(erdata);
} else {
- IFDEBUG(D_ERROR_EMIT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ERROR_EMIT]) {
printf("error_emit DR error tpduli 0x%x\n", error, hdr->tpdu_li);
- dump_buf( (char *)hdr, hdr->tpdu_li );
- ENDDEBUG
- m->m_len = hdr->tpdu_li ;
+ dump_buf((char *) hdr, hdr->tpdu_li);
+ }
+#endif
+ m->m_len = hdr->tpdu_li;
m_freem(erdata);
}
- hdr->tpdu_li --;
- IFTRACE(D_ERROR_EMIT)
- tptrace(TPPTtpduout, 2, hdr, hdr->tpdu_li+1, 0, 0);
- ENDTRACE
+ hdr->tpdu_li--;
+#ifdef TPPT
+ if (tp_traceflags[D_ERROR_EMIT]) {
+ tptrace(TPPTtpduout, 2, hdr, hdr->tpdu_li + 1, 0, 0);
+ }
+#endif
- datalen = m_datalen( m);
+ datalen = m_datalen(m);
if (tpcb) {
- if( tpcb->tp_use_checksum ) {
- IFTRACE(D_ERROR_EMIT)
- tptrace(TPPTmisc, "before gen csum datalen", datalen,0,0,0);
- ENDTRACE
- IFDEBUG(D_ERROR_EMIT)
- printf("before gen csum datalen 0x%x, csum_offset 0x%x\n",
- datalen, csum_offset);
- ENDDEBUG
+ if (tpcb->tp_use_checksum) {
+#ifdef TPPT
+ if (tp_traceflags[D_ERROR_EMIT]) {
+ tptrace(TPPTmisc, "before gen csum datalen", datalen, 0, 0, 0);
+ }
+#endif
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ERROR_EMIT]) {
+ printf("before gen csum datalen 0x%x, csum_offset 0x%x\n",
+ datalen, csum_offset);
+ }
+#endif
iso_gen_csum(m, csum_offset, datalen);
}
-
- IFDEBUG(D_ERROR_EMIT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ERROR_EMIT]) {
printf("OUTPUT: tpcb 0x%x, isop 0x%x, so 0x%x\n",
- tpcb, tpcb->tp_npcb, tpcb->tp_sock);
- ENDDEBUG
+ tpcb, tpcb->tp_npcb, tpcb->tp_sock);
+ }
+#endif
}
if (cons_channel) {
#ifdef TPCONS
- struct pklcd *lcp = (struct pklcd *)cons_channel;
- struct isopcb *isop = (struct isopcb *)lcp->lcd_upnext;
-
- tpcons_dg_output(cons_channel, m, datalen);
- /* was if (tpcb == 0) iso_pcbdetach(isop); */
- /* but other side may want to try again over same VC,
- so, we'll depend on him closing it, but in case it gets forgotten
- we'll mark it for garbage collection */
+ struct pklcd *lcp = (struct pklcd *) cons_channel;
+#ifdef notdef
+ struct isopcb *isop = (struct isopcb *) lcp->lcd_upnext;
+#endif
+ tpcons_output_dg(m, datalen, cons_channel);
+#ifdef notdef
+ if (tpcb == 0) iso_pcbdetach(isop);
+#endif
+ /*
+ * but other side may want to try again over same VC, so,
+ * we'll depend on him closing it, but in case it gets
+ * forgotten we'll mark it for garbage collection
+ */
lcp->lcd_flags |= X25_DG_CIRCUIT;
- IFDEBUG(D_ERROR_EMIT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ERROR_EMIT]) {
printf("OUTPUT: dutype 0x%x channel 0x%x\n",
- dutype, cons_channel);
- ENDDEBUG
+ dutype, cons_channel);
+ }
+#endif
#else
printf("TP panic! cons channel 0x%x but not cons configured\n",
- cons_channel);
+ cons_channel);
#endif
+ return 0;
} else if (tpcb) {
- IFDEBUG(D_ERROR_EMIT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ERROR_EMIT]) {
printf("tp_error_emit 1 sending DG: Laddr\n");
dump_addr(sisotosa(laddr));
printf("Faddr\n");
dump_addr(sisotosa(faddr));
- ENDDEBUG
- return (tpcb->tp_nlproto->nlp_dgoutput)(
- &laddr->siso_addr,
- &faddr->siso_addr,
- m, datalen,
- /* no route */ (caddr_t)0, !tpcb->tp_use_checksum);
+ }
+#endif
+ return (*tpcb->tp_nlproto->nlp_dgoutput) (m, datalen,
+ &laddr->siso_addr,
+ &faddr->siso_addr,
+ /* no route */ (caddr_t) 0, !tpcb->tp_use_checksum);
} else if (dgout_routine) {
- IFDEBUG(D_ERROR_EMIT)
- printf("tp_error_emit sending DG: Laddr\n");
- dump_addr(sisotosa(laddr));
- printf("Faddr\n");
- dump_addr(sisotosa(faddr));
- ENDDEBUG
- return (*dgout_routine)( &laddr->siso_addr, &faddr->siso_addr,
- m, datalen, /* no route */
- (caddr_t)0, /* nochecksum==false */0);
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ERROR_EMIT]) {
+ printf("tp_error_emit sending DG: Laddr\n");
+ dump_addr(sisotosa(laddr));
+ printf("Faddr\n");
+ dump_addr(sisotosa(faddr));
+ }
+#endif
+ return (*dgout_routine) (m, datalen, &laddr->siso_addr, &faddr->siso_addr,
+ (caddr_t) 0, /* nochecksum==false */ 0);
} else {
- IFDEBUG(D_ERROR_EMIT)
- printf("tp_error_emit DROPPING \n", m);
- ENDDEBUG
- IncStat(ts_send_drop);
- m_freem(m);
- return 0;
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ERROR_EMIT]) {
+ printf("tp_error_emit DROPPING \n", m);
+ }
+#endif
+ IncStat(ts_send_drop);
+ m_freem(m);
+ return 0;
}
}
-/* $NetBSD: tp_events.h,v 1.4 1994/06/29 06:40:08 cgd Exp $ */
+/* $OpenBSD: tp_events.h,v 1.2 1996/03/04 10:35:58 mickey Exp $ */
+/* $NetBSD: tp_events.h,v 1.5 1996/02/13 22:10:58 christos Exp $ */
struct tp_event {
- int ev_number;
- struct timeval e_time;
+ int ev_number;
+ struct timeval e_time;
#define TM_inact 0x0
#define TM_retrans 0x1
#define TM_sendack 0x2
#define TM_notused 0x3
- union{
-struct { SeqNum e_low; SeqNum e_high; int e_retrans; } EV_TM_reference;
+ union {
+ struct {
+ SeqNum e_low;
+ SeqNum e_high;
+ int e_retrans;
+ } EV_TM_reference;
#define TM_reference 0x4
-struct { SeqNum e_low; SeqNum e_high; int e_retrans; } EV_TM_data_retrans;
+ struct {
+ SeqNum e_low;
+ SeqNum e_high;
+ int e_retrans;
+ } EV_TM_data_retrans;
#define TM_data_retrans 0x5
-struct {
- u_char e_reason;
- } EV_ER_TPDU;
+ struct {
+ u_char e_reason;
+ } EV_ER_TPDU;
#define ER_TPDU 0x6
-struct { struct mbuf *e_data; /* first field */
- int e_datalen; /* 2nd field */
- u_int e_cdt;
- } EV_CR_TPDU;
+ struct {
+ struct mbuf *e_data; /* first field */
+ int e_datalen; /* 2nd field */
+ u_int e_cdt;
+ } EV_CR_TPDU;
#define CR_TPDU 0x7
-struct { struct mbuf *e_data; /* first field */
- int e_datalen; /* 2nd field */
- u_short e_sref;
- u_char e_reason;
- } EV_DR_TPDU;
+ struct {
+ struct mbuf *e_data; /* first field */
+ int e_datalen; /* 2nd field */
+ u_short e_sref;
+ u_char e_reason;
+ } EV_DR_TPDU;
#define DR_TPDU 0x8
#define DC_TPDU 0x9
-struct { struct mbuf *e_data; /* first field */
- int e_datalen; /* 2nd field */
- u_short e_sref;
- u_int e_cdt;
- } EV_CC_TPDU;
+ struct {
+ struct mbuf *e_data; /* first field */
+ int e_datalen; /* 2nd field */
+ u_short e_sref;
+ u_int e_cdt;
+ } EV_CC_TPDU;
#define CC_TPDU 0xa
-struct { u_int e_cdt;
- SeqNum e_seq;
- SeqNum e_subseq;
- u_char e_fcc_present;
- } EV_AK_TPDU;
+ struct {
+ u_int e_cdt;
+ SeqNum e_seq;
+ SeqNum e_subseq;
+ u_char e_fcc_present;
+ } EV_AK_TPDU;
#define AK_TPDU 0xb
-struct { struct mbuf *e_data; /* first field */
- int e_datalen; /* 2nd field */
- u_int e_eot;
- SeqNum e_seq;
- } EV_DT_TPDU;
+ struct {
+ struct mbuf *e_data; /* first field */
+ int e_datalen; /* 2nd field */
+ u_int e_eot;
+ SeqNum e_seq;
+ } EV_DT_TPDU;
#define DT_TPDU 0xc
-struct { struct mbuf *e_data; /* first field */
- int e_datalen; /* 2nd field */
- SeqNum e_seq;
- } EV_XPD_TPDU;
+ struct {
+ struct mbuf *e_data; /* first field */
+ int e_datalen; /* 2nd field */
+ SeqNum e_seq;
+ } EV_XPD_TPDU;
#define XPD_TPDU 0xd
-struct { SeqNum e_seq; } EV_XAK_TPDU;
+ struct {
+ SeqNum e_seq;
+ } EV_XAK_TPDU;
#define XAK_TPDU 0xe
#define T_CONN_req 0xf
-struct { u_char e_reason; } EV_T_DISC_req;
+ struct {
+ u_char e_reason;
+ } EV_REQ_TPDU;
#define T_DISC_req 0x10
#define T_LISTEN_req 0x11
#define T_DETACH 0x16
#define T_NETRESET 0x17
#define T_ACPT_req 0x18
- }ev_union;
-};/* end struct event */
+ } ev_union;
+}; /* end struct event */
#define tp_NEVENTS 0x19
-
-#define ATTR(X)ev_union.EV_/**/X/**/
-/* $NetBSD: tp_inet.c,v 1.9 1995/08/12 23:59:48 mycroft Exp $ */
+/* $OpenBSD: tp_inet.c,v 1.2 1996/03/04 10:36:00 mickey Exp $ */
+/* $NetBSD: tp_inet.c,v 1.10 1996/02/13 22:11:02 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
/*
* ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison
*/
-/*
- * Here is where you find the inet-dependent code. We've tried
- * keep all net-level and (primarily) address-family-dependent stuff
- * out of the tp source, and everthing here is reached indirectly
- * through a switch table (struct nl_protosw *) tpcb->tp_nlproto
- * (see tp_pcb.c).
- * The routines here are:
- * in_getsufx: gets transport suffix out of an inpcb structure.
- * in_putsufx: put transport suffix into an inpcb structure.
- * in_putnetaddr: put a whole net addr into an inpcb.
- * in_getnetaddr: get a whole net addr from an inpcb.
- * in_cmpnetaddr: compare a whole net addr from an isopcb.
- * in_recycle_suffix: clear suffix for reuse in inpcb
- * tpip_mtu: figure out what size tpdu to use
- * tpip_input: take a pkt from ip, strip off its ip header, give to tp
- * tpip_output_dg: package a pkt for ip given 2 addresses & some data
- * tpip_output: package a pkt for ip given an inpcb & some data
+/*
+ * Here is where you find the inet-dependent code. We've tried keep all
+ * net-level and (primarily) address-family-dependent stuff out of the tp
+ * source, and everthing here is reached indirectly through a switch table
+ * (struct nl_protosw *) tpcb->tp_nlproto (see tp_pcb.c). The routines here
+ * are: in_getsufx: gets transport suffix out of an inpcb structure.
+ * in_putsufx: put transport suffix into an inpcb structure. in_putnetaddr:
+ * put a whole net addr into an inpcb. in_getnetaddr: get a whole net addr
+ * from an inpcb. in_cmpnetaddr: compare a whole net addr from an isopcb.
+ * in_recycle_suffix: clear suffix for reuse in inpcb tpip_mtu: figure out
+ * what size tpdu to use tpip_input: take a pkt from ip, strip off its ip
+ * header, give to tp tpip_output_dg: package a pkt for ip given 2 addresses
+ * & some data tpip_output: package a pkt for ip given an inpcb & some data
*/
#ifdef INET
#include <sys/mbuf.h>
#include <sys/errno.h>
#include <sys/time.h>
+#include <sys/systm.h>
#include <net/if.h>
#include <netiso/tp_trace.h>
#include <netiso/tp_stat.h>
#include <netiso/tp_tpdu.h>
+#include <netiso/tp_var.h>
#include <netinet/in_var.h>
#ifndef ISO
#include <netiso/iso_chksum.c>
#endif
-/*
- * NAME: in_getsufx()
+#include <machine/stdarg.h>
- * CALLED FROM: pr_usrreq() on PRU_BIND,
- * PRU_CONNECT, PRU_ACCEPT, and PRU_PEERADDR
+/*
+ * NAME: in_getsufx()
+ *
+ * CALLED FROM: pr_usrreq() on PRU_BIND,
+ * PRU_CONNECT, PRU_ACCEPT, and PRU_PEERADDR
*
* FUNCTION, ARGUMENTS, and RETURN VALUE:
* Get a transport suffix from an inpcb structure (inp).
* RETURNS: internet port / transport suffix
* (CAST TO AN INT)
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
*/
-in_getsufx(inp, lenp, data_out, which)
- struct inpcb *inp;
- u_short *lenp;
- caddr_t data_out;
- int which;
+void
+in_getsufx(v, lenp, data_out, which)
+ void *v;
+ u_short *lenp;
+ caddr_t data_out;
+ int which;
{
+ struct inpcb *inp = v;
*lenp = sizeof(u_short);
switch (which) {
case TP_LOCAL:
- *(u_short *)data_out = inp->inp_lport;
+ *(u_short *) data_out = inp->inp_lport;
return;
case TP_FOREIGN:
- *(u_short *)data_out = inp->inp_fport;
+ *(u_short *) data_out = inp->inp_fport;
}
}
/*
- * NAME: in_putsufx()
+ * NAME: in_putsufx()
*
- * CALLED FROM: tp_newsocket(); i.e., when a connection
+ * CALLED FROM: tp_newsocket(); i.e., when a connection
* is being established by an incoming CR_TPDU.
*
* FUNCTION, ARGUMENTS:
* Put a transport suffix (found in name) into an inpcb structure (inp).
* The argument (which) takes the value TP_LOCAL or TP_FOREIGN.
*
- * RETURNS: Nada
+ * RETURNS: Nada
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
*/
-/*ARGSUSED*/
+/* ARGSUSED */
void
-in_putsufx(inp, sufxloc, sufxlen, which)
- struct inpcb *inp;
- caddr_t sufxloc;
- int which;
+in_putsufx(v, sufxloc, sufxlen, which)
+ void *v;
+ caddr_t sufxloc;
+ int sufxlen;
+ int which;
{
+ struct inpcb *inp = v;
if (which == TP_FOREIGN) {
- bcopy(sufxloc, (caddr_t)&inp->inp_fport, sizeof(inp->inp_fport));
+ bcopy(sufxloc, (caddr_t) & inp->inp_fport, sizeof(inp->inp_fport));
}
}
/*
- * NAME: in_recycle_tsuffix()
+ * NAME: in_recycle_tsuffix()
*
* CALLED FROM: tp.trans whenever we go into REFWAIT state.
*
* FUNCTION and ARGUMENT:
- * Called when a ref is frozen, to allow the suffix to be reused.
- * (inp) is the net level pcb.
+ * Called when a ref is frozen, to allow the suffix to be reused.
+ * (inp) is the net level pcb.
*
* RETURNS: Nada
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES: This really shouldn't have to be done in a NET level pcb
+ * NOTES: This really shouldn't have to be done in a NET level pcb
* but... for the internet world that just the way it is done in BSD...
* The alternative is to have the port unusable until the reference
* timer goes off.
*/
void
-in_recycle_tsuffix(inp)
- struct inpcb *inp;
+in_recycle_tsuffix(v)
+ void *v;
{
+ struct inpcb *inp = v;
inp->inp_fport = inp->inp_lport = 0;
}
*
* RETURNS: Nada
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
- */
+ * NOTES:
+ */
void
-in_putnetaddr(inp, name, which)
- register struct inpcb *inp;
- struct sockaddr_in *name;
- int which;
+in_putnetaddr(v, nm, which)
+ register void *v;
+ struct sockaddr *nm;
+ int which;
{
+ register struct inpcb *inp = v;
+ struct sockaddr_in *name = (struct sockaddr_in *) nm;
switch (which) {
case TP_LOCAL:
- bcopy((caddr_t)&name->sin_addr,
- (caddr_t)&inp->inp_laddr, sizeof(struct in_addr));
- /* won't work if the dst address (name) is INADDR_ANY */
+ bcopy((caddr_t) & name->sin_addr,
+ (caddr_t) & inp->inp_laddr, sizeof(struct in_addr));
+ /* won't work if the dst address (name) is INADDR_ANY */
break;
case TP_FOREIGN:
- if( name != (struct sockaddr_in *)0 ) {
- bcopy((caddr_t)&name->sin_addr,
- (caddr_t)&inp->inp_faddr, sizeof(struct in_addr));
+ if (name != (struct sockaddr_in *) 0) {
+ bcopy((caddr_t) & name->sin_addr,
+ (caddr_t) & inp->inp_faddr, sizeof(struct in_addr));
}
}
}
/*
- * NAME: in_putnetaddr()
+ * NAME: in_cmpnetaddr()
*
* CALLED FROM:
* tp_input() when a connection is being established by an
*
* RETURNS: Nada
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
- */
-in_cmpnetaddr(inp, name, which)
- register struct inpcb *inp;
- register struct sockaddr_in *name;
- int which;
+ * NOTES:
+ */
+int
+in_cmpnetaddr(v, nm, which)
+ register void *v;
+ register struct sockaddr *nm;
+ int which;
{
+ register struct inpcb *inp = v;
+ struct sockaddr_in *name = (struct sockaddr_in *) nm;
if (which == TP_LOCAL) {
if (name->sin_port && name->sin_port != inp->inp_lport)
return 0;
*
* RETURNS: Nada
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
- */
+ * NOTES:
+ */
void
-in_getnetaddr( inp, name, which)
+in_getnetaddr(v, name, which)
+ void *v;
register struct mbuf *name;
- struct inpcb *inp;
- int which;
+ int which;
{
+ struct inpcb *inp = v;
register struct sockaddr_in *sin = mtod(name, struct sockaddr_in *);
- bzero((caddr_t)sin, sizeof(*sin));
+ bzero((caddr_t) sin, sizeof(*sin));
switch (which) {
case TP_LOCAL:
sin->sin_addr = inp->inp_laddr;
default:
return;
}
- name->m_len = sin->sin_len = sizeof (*sin);
+ name->m_len = sin->sin_len = sizeof(*sin);
sin->sin_family = AF_INET;
}
* It appears that setting a double pointer to the rtentry associated with
* the destination, and returning the header size for the network protocol
* suffices.
- *
+ *
* SIDE EFFECTS:
* Sets tp_routep pointer in pcb.
*
* NOTES:
*/
-
-tpip_mtu(tpcb)
-register struct tp_pcb *tpcb;
+int
+tpip_mtu(v)
+ void *v;
{
- struct inpcb *inp = (struct inpcb *)tpcb->tp_npcb;
+ register struct tp_pcb *tpcb = v;
+ struct inpcb *inp = (struct inpcb *) tpcb->tp_npcb;
- IFDEBUG(D_CONN)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
printf("tpip_mtu(tpcb)\n", tpcb);
printf("tpip_mtu routing to addr 0x%x\n", inp->inp_faddr.s_addr);
- ENDDEBUG
+ }
+#endif
tpcb->tp_routep = &(inp->inp_route.ro_rt);
- return (sizeof (struct ip));
+ return (sizeof(struct ip));
}
* of the fields.
* inp is the inpcb structure; datalen is the length of the data in the
* mbuf string m0.
- * RETURNS:
+ * RETURNS:
* whatever (E*) is returned form the net layer output routine.
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
*/
int
-tpip_output(inp, m0, datalen, nochksum)
- struct inpcb *inp;
- struct mbuf *m0;
- int datalen;
- int nochksum;
+#if __STDC__
+tpip_output(struct mbuf *m0, ...)
+#else
+tpip_output(m0, va_alist)
+ struct mbuf *m0;
+ va_dcl
+#endif
{
- return tpip_output_dg( &inp->inp_laddr, &inp->inp_faddr, m0, datalen,
- &inp->inp_route, nochksum);
+ int datalen;
+ struct inpcb *inp;
+ int nochksum;
+ va_list ap;
+
+ va_start(ap, m0);
+ datalen = va_arg(ap, int);
+ inp = va_arg(ap, struct inpcb *);
+ nochksum = va_arg(ap, int);
+ va_end(ap);
+
+ return tpip_output_dg(m0, datalen, &inp->inp_laddr, &inp->inp_faddr,
+ &inp->inp_route, nochksum);
}
/*
* instead of a pcb. It's used by the tp_error_emit, when we
* don't have an in_pcb with which to call the normal output rtn.
*
- * RETURNS: ENOBUFS or whatever (E*) is
+ * RETURNS: ENOBUFS or whatever (E*) is
* returned form the net layer output routine.
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
*/
-/*ARGSUSED*/
+/* ARGSUSED */
int
-tpip_output_dg(laddr, faddr, m0, datalen, ro, nochksum)
- struct in_addr *laddr, *faddr;
- struct mbuf *m0;
- int datalen;
- struct route *ro;
- int nochksum;
+#if __STDC__
+tpip_output_dg(struct mbuf *m0, ...)
+#else
+tpip_output_dg(m0, va_alist)
+ struct mbuf *m0;
+ va_dcl
+#endif
{
- register struct mbuf *m;
+ int datalen;
+ struct in_addr *laddr, *faddr;
+ struct route *ro;
+ int nochksum;
+ register struct mbuf *m;
register struct ip *ip;
- int error;
+ int error;
+ va_list ap;
- IFDEBUG(D_EMIT)
+ va_start(ap, m0);
+ datalen = va_arg(ap, int);
+ laddr = va_arg(ap, struct in_addr *);
+ faddr = va_arg(ap, struct in_addr *);
+ ro = va_arg(ap, struct route *);
+ nochksum = va_arg(ap, int);
+ va_end(ap);
+
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_EMIT]) {
printf("tpip_output_dg datalen 0x%x m0 0x%x\n", datalen, m0);
- ENDDEBUG
+ }
+#endif
MGETHDR(m, M_DONTWAIT, TPMT_IPHDR);
m->m_len = sizeof(struct ip);
ip = mtod(m, struct ip *);
- bzero((caddr_t)ip, sizeof *ip);
+ bzero((caddr_t) ip, sizeof *ip);
ip->ip_p = IPPROTO_TP;
m->m_pkthdr.len = ip->ip_len = sizeof(struct ip) + datalen;
- ip->ip_ttl = MAXTTL;
- /* don't know why you need to set ttl;
- * overlay doesn't even make this available
- */
+ ip->ip_ttl = MAXTTL;
+ /*
+ * don't know why you need to set ttl; overlay doesn't even make this
+ * available
+ */
ip->ip_src = *laddr;
ip->ip_dst = *faddr;
IncStat(ts_tpdu_sent);
- IFDEBUG(D_EMIT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_EMIT]) {
dump_mbuf(m, "tpip_output_dg before ip_output\n");
- ENDDEBUG
+ }
+#endif
- error = ip_output(m, (struct mbuf *)0, ro, IP_ALLOWBROADCAST, NULL);
+ error = ip_output(m, (struct mbuf *) 0, ro, IP_ALLOWBROADCAST, NULL);
- IFDEBUG(D_EMIT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_EMIT]) {
printf("tpip_output_dg after ip_output\n");
- ENDDEBUG
+ }
+#endif
return error;
* FUNCTION and ARGUMENTS:
* Take a packet (m) from ip, strip off the ip header and give it to tp
*
- * RETURNS: No return value.
- *
+ * RETURNS: No return value.
+ *
* SIDE EFFECTS:
*
* NOTES:
*/
void
-tpip_input(m, iplen)
- struct mbuf *m;
- int iplen;
+#if __STDC__
+tpip_input(struct mbuf *m, ...)
+#else
+tpip_input(m, va_alist)
+ struct mbuf *m;
+ va_dcl
+#endif
{
- struct sockaddr_in src, dst;
- register struct ip *ip;
- int s = splsoftnet(), hdrlen;
+ int iplen;
+ struct sockaddr_in src, dst;
+ register struct ip *ip;
+ int s = splsoftnet(), hdrlen;
+ va_list ap;
+
+ va_start(ap, m);
+ iplen = va_arg(ap, int);
+ va_end(ap);
IncStat(ts_pkt_rcvd);
*/
- if((m = m_pullup(m, iplen + 1)) == MNULL)
+ if ((m = m_pullup(m, iplen + 1)) == MNULL)
goto discard;
CHANGE_MTYPE(m, TPMT_DATA);
-
+
/*
* Now pull up the whole tp header:
* Unfortunately, there may be IP options to skip past so we
*/
hdrlen = iplen + 1 + mtod(m, u_char *)[iplen];
- if( m->m_len < hdrlen ) {
- if((m = m_pullup(m, hdrlen)) == MNULL){
- IFDEBUG(D_TPINPUT)
+ if (m->m_len < hdrlen) {
+ if ((m = m_pullup(m, hdrlen)) == MNULL) {
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
printf("tp_input, pullup 2!\n");
- ENDDEBUG
+ }
+#endif
goto discard;
}
}
- /*
- * cannot use tp_inputprep() here 'cause you don't
- * have quite the same situation
+ /*
+ * cannot use tp_inputprep() here 'cause you don't have quite the
+ * same situation
*/
- IFDEBUG(D_TPINPUT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
dump_mbuf(m, "after tpip_input both pullups");
- ENDDEBUG
- /*
+ }
+#endif
+ /*
* m_pullup may have returned a different mbuf
*/
ip = mtod(m, struct ip *);
m->m_len -= iplen;
m->m_data += iplen;
- src.sin_addr = *(struct in_addr *)&(ip->ip_src);
- src.sin_family = AF_INET;
- src.sin_len = sizeof(src);
- dst.sin_addr = *(struct in_addr *)&(ip->ip_dst);
- dst.sin_family = AF_INET;
- dst.sin_len = sizeof(dst);
+ src.sin_addr = *(struct in_addr *) & (ip->ip_src);
+ src.sin_family = AF_INET;
+ src.sin_len = sizeof(src);
+ dst.sin_addr = *(struct in_addr *) & (ip->ip_dst);
+ dst.sin_family = AF_INET;
+ dst.sin_len = sizeof(dst);
tp_input(m, sintosa(&src), sintosa(&dst), 0, tpip_output_dg, 0);
return;
discard:
- IFDEBUG(D_TPINPUT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
printf("tpip_input DISCARD\n");
- ENDDEBUG
- IFTRACE(D_TPINPUT)
- tptrace(TPPTmisc, "tpip_input DISCARD m", m,0,0,0);
- ENDTRACE
- m_freem(m);
+ }
+#endif
+#ifdef TPPT
+ if (tp_traceflags[D_TPINPUT]) {
+ tptrace(TPPTmisc, "tpip_input DISCARD m", m, 0, 0, 0);
+ }
+#endif
+ m_freem(m);
IncStat(ts_recv_drop);
splx(s);
}
#include <sys/protosw.h>
#include <netinet/ip_icmp.h>
-extern void tp_quench();
/*
* NAME: tpin_quench()
*
*
* RETURNS: Nada
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
*/
void
-tpin_quench(inp)
- struct inpcb *inp;
+tpin_quench(inp, dummy)
+ struct inpcb *inp;
+ int dummy;
{
- tp_quench((struct tp_pcb *)inp->inp_socket->so_pcb, PRC_QUENCH);
+ tp_quench((struct inpcb *) inp->inp_socket->so_pcb, PRC_QUENCH);
}
/*
* It either returns an error status to the user or
* causes all connections on this address to be aborted
* by calling the appropriate xx_notify() routine.
- * (cmd) is the type of ICMP error.
+ * (cmd) is the type of ICMP error.
* (sa) the address of the sender
*
* RETURNS: Nothing
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
*/
-void
-tpip_ctlinput(cmd, sin)
- int cmd;
- struct sockaddr_in *sin;
+void *
+tpip_ctlinput(cmd, sa, dummy)
+ int cmd;
+ struct sockaddr *sa;
+ void *dummy;
{
- extern int inetctlerrmap[];
- void (*notify) __P((struct inpcb *, int));
- void tp_quench __P((struct inpcb *, int));
- void tpin_abort __P((struct inpcb *, int));
- int errno;
+ struct sockaddr_in *sin = (struct sockaddr_in *) sa;
+ extern int inetctlerrmap[];
+ void (*notify) __P((struct inpcb *, int));
+ int errno;
if (cmd < 0 || cmd >= PRC_NCMDS)
- return;
+ return NULL;
if (sin->sin_family != AF_INET && sin->sin_family != AF_IMPLINK)
- return;
+ return NULL;
if (sin->sin_addr.s_addr == INADDR_ANY)
- return;
+ return NULL;
errno = inetctlerrmap[cmd];
switch (cmd) {
- case PRC_QUENCH:
- notify = tp_quench;
- break;
+ case PRC_QUENCH:
+ notify = tp_quench;
+ break;
- case PRC_ROUTEDEAD:
- case PRC_HOSTUNREACH:
- case PRC_UNREACH_NET:
- case PRC_IFDOWN:
- case PRC_HOSTDEAD:
- notify = in_rtchange;
- break;
+ case PRC_ROUTEDEAD:
+ case PRC_HOSTUNREACH:
+ case PRC_UNREACH_NET:
+ case PRC_IFDOWN:
+ case PRC_HOSTDEAD:
+ notify = in_rtchange;
+ break;
- default:
+ default:
/*
case PRC_MSGSIZE:
case PRC_UNREACH_HOST:
case PRC_TIMXCEED_REASS:
case PRC_PARAMPROB:
*/
- notify = tpin_abort;
- break;
+ notify = tpin_abort;
+ break;
}
in_pcbnotifyall(&tp_inpcb, sintosa(sin), errno, notify);
+ return NULL;
}
/*
*
* RETURNS: Nothing
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
*/
void
tpin_abort(inp, n)
- struct inpcb *inp;
- int n;
+ struct inpcb *inp;
+ int n;
{
struct tp_event e;
e.ev_number = ER_TPDU;
- e.ATTR(ER_TPDU).e_reason = ENETRESET;
- tp_driver((struct tp_pcb *)inp->inp_ppcb, &e);
+ e.TPDU_ATTR(ER).e_reason = ENETRESET;
+ tp_driver((struct tp_pcb *) inp->inp_ppcb, &e);
}
#ifdef ARGO_DEBUG
+void
dump_inaddr(addr)
register struct sockaddr_in *addr;
{
printf("INET: port 0x%x; addr 0x%x\n", addr->sin_port, addr->sin_addr);
}
-#endif /* ARGO_DEBUG */
-#endif /* INET */
+#endif /* ARGO_DEBUG */
+#endif /* INET */
-/* $NetBSD: tp_input.c,v 1.7 1995/06/13 07:13:42 mycroft Exp $ */
+/* $OpenBSD: tp_input.c,v 1.2 1996/03/04 10:36:02 mickey Exp $ */
+/* $NetBSD: tp_input.c,v 1.8 1996/02/13 22:11:08 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
/*
* ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison
*/
-/*
- * tp_input() gets an mbuf chain from ip. Actually, not directly
- * from ip, because ip calls a net-level routine that strips off
- * the net header and then calls tp_input(), passing the proper type
- * of addresses for the address family in use (how it figures out
- * which AF is not yet determined.)
+/*
+ * tp_input() gets an mbuf chain from ip. Actually, not directly from ip,
+ * because ip calls a net-level routine that strips off the net header and
+ * then calls tp_input(), passing the proper type of addresses for the
+ * address family in use (how it figures out which AF is not yet determined.)
*
* Decomposing the tpdu is some of the most laughable code. The variable-length
- * parameters and the problem of non-aligned memory references
- * necessitates such abominations as the macros WHILE_OPTIONS (q.v. below)
- * to loop through the header and decompose it.
+ * parameters and the problem of non-aligned memory references necessitates
+ * such abominations as the macros WHILE_OPTIONS (q.v. below) to loop through
+ * the header and decompose it.
*
* The routine tp_newsocket() is called when a CR comes in for a listening
* socket. tp_input calls sonewconn() and tp_newsocket() to set up the
- * "child" socket. Most tpcb values are copied from the parent tpcb into
- * the child.
- *
- * Also in here is tp_headersize() (grot) which tells the expected size
- * of a tp header, to be used by other layers. It's in here because it
- * uses the static structure tpdu_info.
+ * "child" socket. Most tpcb values are copied from the parent tpcb into the
+ * child.
+ *
+ * Also in here is tp_headersize() (grot) which tells the expected size of a tp
+ * header, to be used by other layers. It's in here because it uses the
+ * static structure tpdu_info.
*/
#include <sys/param.h>
#include <sys/time.h>
#include <sys/kernel.h>
+#include <net/if.h>
+
#include <netiso/iso.h>
#include <netiso/iso_errno.h>
#include <netiso/iso_pcb.h>
#include <netiso/argo_debug.h>
#include <netiso/tp_trace.h>
#include <netiso/tp_tpdu.h>
+#include <netiso/tp_var.h>
+#include <netiso/iso_var.h>
-#include <net/if.h>
#ifdef TRUE
#undef FALSE
#undef TRUE
#include <netccitt/pk.h>
#include <netccitt/pk_var.h>
-int iso_check_csum(), tp_driver(), tp_headersize(), tp_error_emit();
+#include <machine/stdarg.h>
-/*
- #ifdef lint
- #undef ATTR
- #define ATTR(X)ev_number
- #endif lint
-*/
-
-struct mbuf *
-tp_inputprep(m)
+static struct socket *tp_newsocket __P((struct socket *, struct sockaddr *,
+ caddr_t, u_int, u_int));
+
+struct mbuf *
+tp_inputprep(m)
register struct mbuf *m;
{
- int hdrlen;
-
- IFDEBUG(D_TPINPUT)
- printf("tp_inputprep: m 0x%x\n", m) ;
- ENDDEBUG
-
- while( m->m_len < 1 ) {
- /* The "m_free" logic
- * if( (m = m_free(m)) == MNULL )
- * return (struct mbuf *)0;
- * would cause a system crash if ever executed.
- * This logic will be executed if the first mbuf
- * in the chain only contains a CLNP header. The m_free routine
- * will release the mbuf containing the CLNP header from the
- * chain and the new head of the chain will not have the
- * M_PKTHDR bit set. This routine, tp_inputprep, will
- * eventually call the "sbappendaddr" routine. "sbappendaddr"
- * calls "panic" if M_PKTHDR is not set. m_pullup is a cheap
- * way of keeping the head of the chain from being freed.
+ int hdrlen;
+
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
+ printf("tp_inputprep: m 0x%x\n", m);
+ }
+#endif
+
+ while (m->m_len < 1) {
+ /*
+ * The "m_free" logic if( (m = m_free(m)) == MNULL ) return
+ * (struct mbuf *)0; would cause a system crash if ever
+ * executed. This logic will be executed if the first mbuf in
+ * the chain only contains a CLNP header. The m_free routine
+ * will release the mbuf containing the CLNP header from the
+ * chain and the new head of the chain will not have the
+ * M_PKTHDR bit set. This routine, tp_inputprep, will
+ * eventually call the "sbappendaddr" routine. "sbappendaddr"
+ * calls "panic" if M_PKTHDR is not set. m_pullup is a cheap
+ * way of keeping the head of the chain from being freed.
*/
- if((m = m_pullup(m, 1)) == MNULL)
+ if ((m = m_pullup(m, 1)) == MNULL)
return (MNULL);
}
- if(((long)m->m_data) & 0x3) {
- /* If we are not 4-byte aligned, we have to be
- * above the beginning of the mbuf, and it is ok just
- * to slide it back.
+ if (((long) m->m_data) & 0x3) {
+ /*
+ * If we are not 4-byte aligned, we have to be above the
+ * beginning of the mbuf, and it is ok just to slide it back.
*/
- caddr_t ocp = m->m_data;
+ caddr_t ocp = m->m_data;
- m->m_data = (caddr_t)(((long)m->m_data) & ~0x3);
- bcopy(ocp, m->m_data, (unsigned)m->m_len);
+ m->m_data = (caddr_t) (((long) m->m_data) & ~0x3);
+ bcopy(ocp, m->m_data, (unsigned) m->m_len);
}
CHANGE_MTYPE(m, TPMT_DATA);
- /* we KNOW that there is at least 1 byte in this mbuf
- and that it is hdr->tpdu_li XXXXXXX! */
+ /*
+ * we KNOW that there is at least 1 byte in this mbuf and that it is
+ * hdr->tpdu_li XXXXXXX!
+ */
- hdrlen = 1 + *mtod( m, u_char *);
+ hdrlen = 1 + *mtod(m, u_char *);
/*
- * now pull up the whole tp header
+ * now pull up the whole tp header
*/
- if ( m->m_len < hdrlen) {
- if ((m = m_pullup(m, hdrlen)) == MNULL ) {
+ if (m->m_len < hdrlen) {
+ if ((m = m_pullup(m, hdrlen)) == MNULL) {
IncStat(ts_recv_drop);
- return (struct mbuf *)0;
+ return (struct mbuf *) 0;
}
}
- IFDEBUG(D_INPUT)
- printf(
- " at end: m 0x%x hdr->tpdu_li 0x%x m_len 0x%x\n",m,
- hdrlen, m->m_len);
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_INPUT]) {
+ printf(
+ " at end: m 0x%x hdr->tpdu_li 0x%x m_len 0x%x\n", m,
+ hdrlen, m->m_len);
+ }
+#endif
return m;
}
-/* begin groan
- * -- this array and the following macros allow you to step through the
- * parameters of the variable part of a header
- * note that if for any reason the values of the **_TPDU macros (in tp_events.h)
- * should change, this array has to be rearranged
+/*
+ * begin groan -- this array and the following macros allow you to step
+ * through the parameters of the variable part of a header note that if for
+ * any reason the values of the **_TPDU macros (in tp_events.h) should
+ * change, this array has to be rearranged
*/
#define TP_LEN_CLASS_0_INDEX 2
#define TP_MAX_DATA_INDEX 3
-static u_char tpdu_info[][4] =
+static u_char tpdu_info[][4] =
{
-/* length max data len */
-/* reg fmt xtd fmt class 0 */
- /* UNUSED 0x0 */ 0x0 , 0x0, 0x0, 0x0,
- /* XPD_TPDU_type 0x1 */ 0x5, 0x8, 0x0, TP_MAX_XPD_DATA,
- /* XAK_TPDU_type 0x2 */ 0x5 , 0x8, 0x0, 0x0,
- /* GR_TPDU_type 0x3 */ 0x0 , 0x0, 0x0, 0x0,
- /* UNUSED 0x4 */ 0x0 , 0x0, 0x0, 0x0,
- /* UNUSED 0x5 */ 0x0 , 0x0, 0x0, 0x0,
- /* AK_TPDU_type 0x6 */ 0x5, 0xa, 0x0, 0x0,
- /* ER_TPDU_type 0x7 */ 0x5, 0x5, 0x0, 0x0,
- /* DR_TPDU_type 0x8 */ 0x7, 0x7, 0x7, TP_MAX_DR_DATA,
- /* UNUSED 0x9 */ 0x0 , 0x0, 0x0, 0x0,
- /* UNUSED 0xa */ 0x0 , 0x0, 0x0, 0x0,
- /* UNUSED 0xb */ 0x0 , 0x0, 0x0, 0x0,
- /* DC_TPDU_type 0xc */ 0x6, 0x6, 0x0, 0x0,
- /* CC_TPDU_type 0xd */ 0x7, 0x7, 0x7, TP_MAX_CC_DATA,
- /* CR_TPDU_type 0xe */ 0x7, 0x7, 0x7, TP_MAX_CR_DATA,
- /* DT_TPDU_type 0xf */ 0x5, 0x8, 0x3, 0x0,
+ /* length max data len */
+ /* reg fmt xtd fmt class 0 */
+ /* UNUSED 0x0 */ { 0x0, 0x0, 0x0, 0x0 },
+ /* XPD_TPDU_type 0x1 */ { 0x5, 0x8, 0x0, TP_MAX_XPD_DATA },
+ /* XAK_TPDU_type 0x2 */ { 0x5, 0x8, 0x0, 0x0 },
+ /* GR_TPDU_type 0x3 */ { 0x0, 0x0, 0x0, 0x0 },
+ /* UNUSED 0x4 */ { 0x0, 0x0, 0x0, 0x0 },
+ /* UNUSED 0x5 */ { 0x0, 0x0, 0x0, 0x0 },
+ /* AK_TPDU_type 0x6 */ { 0x5, 0xa, 0x0, 0x0 },
+ /* ER_TPDU_type 0x7 */ { 0x5, 0x5, 0x0, 0x0 },
+ /* DR_TPDU_type 0x8 */ { 0x7, 0x7, 0x7, TP_MAX_DR_DATA },
+ /* UNUSED 0x9 */ { 0x0, 0x0, 0x0, 0x0 },
+ /* UNUSED 0xa */ { 0x0, 0x0, 0x0, 0x0 },
+ /* UNUSED 0xb */ { 0x0, 0x0, 0x0, 0x0 },
+ /* DC_TPDU_type 0xc */ { 0x6, 0x6, 0x0, 0x0 },
+ /* CC_TPDU_type 0xd */ { 0x7, 0x7, 0x7, TP_MAX_CC_DATA },
+ /* CR_TPDU_type 0xe */ { 0x7, 0x7, 0x7, TP_MAX_CR_DATA },
+ /* DT_TPDU_type 0xf */ { 0x5, 0x8, 0x3, 0x0 },
};
#define CHECK(Phrase, Erval, Stat, Whattodo, Loc)\
if (Phrase) {error = (Erval); errlen = (int)(Loc); IncStat(Stat);\
goto Whattodo; }
-/*
- * WHENEVER YOU USE THE FOLLOWING MACRO,
- * BE SURE THE TPDUTYPE IS A LEGIT VALUE FIRST!
+/*
+ * WHENEVER YOU USE THE FOLLOWING MACRO, BE SURE THE TPDUTYPE IS A LEGIT
+ * VALUE FIRST!
*/
#define WHILE_OPTIONS(P, hdr, format)\
*/
static struct socket *
tp_newsocket(so, fname, cons_channel, class_to_use, netservice)
- struct socket *so;
- struct sockaddr *fname;
- caddr_t cons_channel;
- u_char class_to_use;
- u_int netservice;
+ struct socket *so;
+ struct sockaddr *fname;
+ caddr_t cons_channel;
+ u_int class_to_use;
+ u_int netservice;
{
- register struct tp_pcb *tpcb = sototpcb(so); /* old tpcb, needed below */
- register struct tp_pcb *newtpcb;
+ register struct tp_pcb *tpcb = sototpcb(so); /* old tpcb, needed
+ * below */
+ register struct tp_pcb *newtpcb;
- /*
- * sonewconn() gets a new socket structure,
- * a new lower layer pcb and a new tpcb,
- * but the pcbs are unnamed (not bound)
+ /*
+ * sonewconn() gets a new socket structure, a new lower layer pcb and
+ * a new tpcb, but the pcbs are unnamed (not bound)
*/
- IFTRACE(D_NEWSOCK)
+#ifdef TPPT
+ if (tp_traceflags[D_NEWSOCK]) {
tptraceTPCB(TPPTmisc, "newsock: listg_so, _tpcb, so_head",
- so, tpcb, so->so_head, 0);
- ENDTRACE
+ so, tpcb, so->so_head, 0);
+ }
+#endif
- if ((so = sonewconn(so, SS_ISCONFIRMING)) == (struct socket *)0)
+ if ((so = sonewconn(so, SS_ISCONFIRMING)) == (struct socket *) 0)
return so;
- IFTRACE(D_NEWSOCK)
+#ifdef TPPT
+ if (tp_traceflags[D_NEWSOCK]) {
tptraceTPCB(TPPTmisc, "newsock: after newconn so, so_head",
- so, so->so_head, 0, 0);
- ENDTRACE
+ so, so->so_head, 0, 0);
+ }
+#endif
- IFDEBUG(D_NEWSOCK)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_NEWSOCK]) {
printf("tp_newsocket(channel 0x%x) after sonewconn so 0x%x \n",
- cons_channel, so);
+ cons_channel, so);
dump_addr(fname);
- {
- struct socket *t, *head ;
+ {
+ struct socket *t, *head;
head = so->so_head;
t = so;
printf("so 0x%x so_head 0x%x so_q0 0x%x, q0len %d\n",
- t, t->so_head, t->so_q0, t->so_q0len);
- while( (t=t->so_q0) && t!= so && t!= head)
+ t, t->so_head, t->so_q0, t->so_q0len);
+ while ((t = t->so_q0) && t != so && t != head)
printf("so 0x%x so_head 0x%x so_q0 0x%x, q0len %d\n",
- t, t->so_head, t->so_q0, t->so_q0len);
+ t, t->so_head, t->so_q0, t->so_q0len);
}
- ENDDEBUG
+ }
+#endif
- /*
- * before we clobber the old tpcb ptr, get these items from the parent pcb
+ /*
+ * before we clobber the old tpcb ptr, get these items from the
+ * parent pcb
*/
newtpcb = sototpcb(so);
newtpcb->_tp_param = tpcb->_tp_param;
newtpcb->tp_lcredit = tpcb->tp_lcredit;
newtpcb->tp_l_tpdusize = tpcb->tp_l_tpdusize;
newtpcb->tp_lsuffixlen = tpcb->tp_lsuffixlen;
- bcopy( tpcb->tp_lsuffix, newtpcb->tp_lsuffix, newtpcb->tp_lsuffixlen);
+ bcopy(tpcb->tp_lsuffix, newtpcb->tp_lsuffix, newtpcb->tp_lsuffixlen);
- if( /* old */ tpcb->tp_ucddata) {
- /*
- * These data are the connect- , confirm- or disconnect- data.
+ if ( /* old */ tpcb->tp_ucddata) {
+ /*
+ * These data are the connect- , confirm- or disconnect-
+ * data.
*/
- struct mbuf *conndata;
+ struct mbuf *conndata;
- conndata = m_copy(tpcb->tp_ucddata, 0, (int)M_COPYALL);
- IFDEBUG(D_CONN)
+ conndata = m_copy(tpcb->tp_ucddata, 0, (int) M_COPYALL);
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
dump_mbuf(conndata, "conndata after mcopy");
- ENDDEBUG
+ }
+#endif
newtpcb->tp_ucddata = conndata;
}
-
tpcb = newtpcb;
tpcb->tp_state = TP_LISTENING;
tpcb->tp_class = class_to_use;
tpcb->tp_netservice = netservice;
- ASSERT( fname != 0 ) ; /* just checking */
- if ( fname ) {
+ ASSERT(fname != 0); /* just checking */
+ if (fname) {
/*
* tp_route_to takes its address argument in the form of an mbuf.
*/
- struct mbuf *m;
- int err;
+ struct mbuf *m;
+ int err;
- MGET(m, M_DONTWAIT, MT_SONAME); /* mbuf type used is confusing */
+ MGET(m, M_DONTWAIT, MT_SONAME); /* mbuf type used is
+ * confusing */
if (m) {
/*
* this seems a bit grotesque, but tp_route_to expects
* pcb_connect, which expects the name/addr in an mbuf as well.
* sigh.
*/
- bcopy((caddr_t)fname, mtod(m, caddr_t), fname->sa_len);
+ bcopy((caddr_t) fname, mtod(m, caddr_t), fname->sa_len);
m->m_len = fname->sa_len;
- /* grot : have to say the kernel can override params in
- * the passive open case
+ /*
+ * grot : have to say the kernel can override params
+ * in the passive open case
*/
tpcb->tp_dont_change_params = 0;
- err = tp_route_to( m, tpcb, cons_channel);
+ err = tp_route_to(m, tpcb, cons_channel);
m_free(m);
if (!err)
goto ok;
}
- IFDEBUG(D_CONN)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
printf("tp_route_to FAILED! detaching tpcb 0x%x, so 0x%x\n",
- tpcb, so);
- ENDDEBUG
- (void) tp_detach(tpcb);
+ tpcb, so);
+ }
+#endif
+ (void) tp_detach(tpcb);
return 0;
}
ok:
- IFDEBUG(D_TPINPUT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
printf("tp_newsocket returning so 0x%x, sototpcb(so) 0x%x\n",
- so, sototpcb(so));
- ENDDEBUG
+ so, sototpcb(so));
+ }
+#endif
return so;
}
-#ifndef TPCONS
-tpcons_output()
-{
- return(0);
-}
-#endif /* !CONS */
-
-/*
+/*
* NAME: tp_input()
*
- * CALLED FROM:
- * net layer input routine
+ * CALLED FROM: net layer input routine
*
- * FUNCTION and ARGUMENTS:
- * Process an incoming TPDU (m), finding the associated tpcb if there
- * is one. Create the appropriate type of event and call the driver.
- * (faddr) and (laddr) are the foreign and local addresses.
- *
- * When tp_input() is called we KNOW that the ENTIRE TP HEADER
- * has been m_pullup-ed.
+ * FUNCTION and ARGUMENTS: Process an incoming TPDU (m), finding the associated
+ * tpcb if there is one. Create the appropriate type of event and call the
+ * driver. (faddr) and (laddr) are the foreign and local addresses.
+ *
+ * When tp_input() is called we KNOW that the ENTIRE TP HEADER has been
+ * m_pullup-ed.
*
* RETURN VALUE: Nada
- *
- * SIDE EFFECTS:
- * When using COSNS it may affect the state of the net-level pcb
*
- * NOTE:
- * The initial value of acktime is 2 so that we will never
- * have a 0 value for tp_peer_acktime. It gets used in the
- * computation of the retransmission timer value, and so it
- * mustn't be zero.
- * 2 seems like a reasonable minimum.
+ * SIDE EFFECTS: When using COSNS it may affect the state of the net-level pcb
+ *
+ * NOTE: The initial value of acktime is 2 so that we will never have a 0 value
+ * for tp_peer_acktime. It gets used in the computation of the
+ * retransmission timer value, and so it mustn't be zero. 2 seems like a
+ * reasonable minimum.
*/
void
-tp_input(m, faddr, laddr, cons_channel, dgout_routine, ce_bit)
- register struct mbuf *m;
- struct sockaddr *faddr, *laddr; /* NSAP addresses */
- caddr_t cons_channel;
- int (*dgout_routine)();
- int ce_bit;
-
+#if __STDC__
+tp_input(struct mbuf *m, ...)
+#else
+tp_input(m, va_alist)
+ struct mbuf *m;
+ va_dcl
+#endif
{
- register struct tp_pcb *tpcb;
- register struct tpdu *hdr;
- struct socket *so;
- struct tp_event e;
- int error;
- unsigned dutype;
- u_short dref, sref, acktime, subseq;
- u_char preferred_class, class_to_use, pdusize;
- u_char opt, dusize, addlopt, version;
+ struct sockaddr *faddr, *laddr; /* NSAP addresses */
+ caddr_t cons_channel;
+ int (*dgout_routine) __P((struct mbuf *, ...));
+ int ce_bit;
+ register struct tp_pcb *tpcb;
+ register struct tpdu *hdr;
+ struct socket *so;
+ struct tp_event e;
+ int error;
+ unsigned dutype;
+ u_short dref, sref, acktime, subseq;
+ u_char preferred_class, class_to_use, pdusize;
+ u_char opt, dusize, addlopt, version = 0;
#ifdef TP_PERF_MEAS
- u_char perf_meas;
-#endif /* TP_PERF_MEAS */
- u_char fsufxlen, lsufxlen;
- caddr_t fsufxloc, lsufxloc;
- int tpdu_len;
- u_int takes_data;
- u_int fcc_present;
- int errlen;
- struct tp_conn_param tpp;
- int tpcons_output();
+ u_char perf_meas;
+#endif /* TP_PERF_MEAS */
+ u_char fsufxlen, lsufxlen;
+ caddr_t fsufxloc, lsufxloc;
+ int tpdu_len;
+ u_int takes_data;
+ u_int fcc_present;
+ int errlen;
+ struct tp_conn_param tpp;
+ va_list ap;
+
+ va_start(ap, m);
+ faddr = va_arg(ap, struct sockaddr *);
+ laddr = va_arg(ap, struct sockaddr *);
+ cons_channel = va_arg(ap, caddr_t);
+ /* XXX: Does va_arg does not work for function ptrs */
+ dgout_routine = (int (*) __P((struct mbuf *, ...))) va_arg(ap, void *);
+ ce_bit = va_arg(ap, int);
+ va_end(ap);
again:
hdr = mtod(m, struct tpdu *);
tpcb = 0;
error = errlen = tpdu_len = 0;
takes_data = fcc_present = FALSE;
- acktime = 2; sref = subseq = 0;
+ acktime = 2;
+ sref = subseq = 0;
fsufxloc = lsufxloc = NULL;
fsufxlen = lsufxlen =
preferred_class = class_to_use = pdusize = addlopt = 0;
dusize = TP_DFL_TPDUSIZE;
#ifdef TP_PERF_MEAS
- GET_CUR_TIME( &e.e_time ); perf_meas = 0;
-#endif /* TP_PERF_MEAS */
-
- IFDEBUG(D_TPINPUT)
+ GET_CUR_TIME(&e.e_time);
+ perf_meas = 0;
+#endif /* TP_PERF_MEAS */
+
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
printf("tp_input(0x%x, ... 0x%x)\n", m, cons_channel);
- ENDDEBUG
+ }
+#endif
- /*
- * get the actual tpdu length - necessary for monitoring
- * and for checksumming
- *
+ /*
+ * get the actual tpdu length - necessary for monitoring and for
+ * checksumming
+ *
* Also, maybe measure the mbuf chain lengths and sizes.
*/
- { register struct mbuf *n=m;
-# ifdef ARGO_DEBUG
- int chain_length = 0;
-# endif ARGO_DEBUG
+ {
+ register struct mbuf *n = m;
+#ifdef ARGO_DEBUG
+ int chain_length = 0;
+#endif /* ARGO_DEBUG */
- for(;;) {
+ for (;;) {
tpdu_len += n->m_len;
- IFDEBUG(D_MBUF_MEAS)
- if( n->m_flags & M_EXT) {
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_MBUF_MEAS]) {
+ if (n->m_flags & M_EXT) {
IncStat(ts_mb_cluster);
} else {
IncStat(ts_mb_small);
}
- chain_length ++;
- ENDDEBUG
- if (n->m_next == MNULL ) {
+ chain_length++;
+ }
+#endif
+ if (n->m_next == MNULL) {
break;
}
n = n->m_next;
}
- IFDEBUG(D_MBUF_MEAS)
- if(chain_length > 16)
- chain_length = 0; /* zero used for anything > 16 */
- tp_stat.ts_mb_len_distr[chain_length] ++;
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_MBUF_MEAS]) {
+ if (chain_length > 16)
+ chain_length = 0; /* zero used for
+ * anything > 16 */
+ tp_stat.ts_mb_len_distr[chain_length]++;
+ }
+#endif
+ }
+#ifdef TPPT
+ if (tp_traceflags[D_TPINPUT]) {
+ tptraceTPCB(TPPTtpduin, hdr->tpdu_type, hdr, hdr->tpdu_li + 1,
+ tpdu_len, 0);
}
- IFTRACE(D_TPINPUT)
- tptraceTPCB(TPPTtpduin, hdr->tpdu_type, hdr, hdr->tpdu_li+1, tpdu_len,
- 0);
- ENDTRACE
+#endif
- dref = ntohs((short)hdr->tpdu_dref);
- sref = ntohs((short)hdr->tpdu_sref);
- dutype = (int)hdr->tpdu_type;
+ dref = ntohs((short) hdr->tpdu_dref);
+ sref = ntohs((short) hdr->tpdu_sref);
+ dutype = (int) hdr->tpdu_type;
- IFDEBUG(D_TPINPUT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
printf("input: dutype 0x%x cons_channel 0x%x dref 0x%x\n", dutype,
- cons_channel, dref);
+ cons_channel, dref);
printf("input: dref 0x%x sref 0x%x\n", dref, sref);
- ENDDEBUG
- IFTRACE(D_TPINPUT)
- tptrace(TPPTmisc, "channel dutype dref ",
+ }
+#endif
+#ifdef TPPT
+ if (tp_traceflags[D_TPINPUT]) {
+ tptrace(TPPTmisc, "channel dutype dref ",
cons_channel, dutype, dref, 0);
- ENDTRACE
+ }
+#endif
#ifdef ARGO_DEBUG
- if( (dutype < TP_MIN_TPDUTYPE) || (dutype > TP_MAX_TPDUTYPE)) {
+ if ((dutype < TP_MIN_TPDUTYPE) || (dutype > TP_MAX_TPDUTYPE)) {
printf("BAD dutype! 0x%x, channel 0x%x dref 0x%x\n",
- dutype, cons_channel, dref);
- dump_buf (m, sizeof( struct mbuf ));
+ dutype, cons_channel, dref);
+ dump_buf(m, sizeof(struct mbuf));
IncStat(ts_inv_dutype);
goto discard;
}
-#endif /* ARGO_DEBUG */
+#endif /* ARGO_DEBUG */
- CHECK( (dutype < TP_MIN_TPDUTYPE || dutype > TP_MAX_TPDUTYPE),
- E_TP_INV_TPDU, ts_inv_dutype, respond,
- 2 );
- /* unfortunately we can't take the address of the tpdu_type field,
- * since it's a bit field - so we just use the constant offset 2
- */
+ CHECK((dutype < TP_MIN_TPDUTYPE || dutype > TP_MAX_TPDUTYPE),
+ E_TP_INV_TPDU, ts_inv_dutype, respond,
+ 2);
+ /*
+ * unfortunately we can't take the address of the tpdu_type field,
+ * since it's a bit field - so we just use the constant offset 2
+ */
- /* Now this isn't very neat but since you locate a pcb one way
- * at the beginning of connection establishment, and by
- * the dref for each tpdu after that, we have to treat CRs differently
+ /*
+ * Now this isn't very neat but since you locate a pcb one way at the
+ * beginning of connection establishment, and by the dref for each
+ * tpdu after that, we have to treat CRs differently
*/
- if ( dutype == CR_TPDU_type ) {
- u_char alt_classes = 0;
+ if (dutype == CR_TPDU_type) {
+ u_char alt_classes = 0;
preferred_class = 1 << hdr->tpdu_CRclass;
opt = hdr->tpdu_CRoptions;
- WHILE_OPTIONS(P, hdr, 1 ) /* { */
-
- switch( vbptr(P)->tpv_code ) {
+ WHILE_OPTIONS(P, hdr, 1) /* { */
+ switch (vbptr(P)->tpv_code) {
- case TPP_tpdu_size:
- vb_getval(P, u_char, dusize);
- IFDEBUG(D_TPINPUT)
- printf("CR dusize 0x%x\n", dusize);
- ENDDEBUG
- /* COS tests: NBS IA (Dec. 1987) Sec. 4.5.2.1 */
- if (dusize < TP_MIN_TPDUSIZE || dusize > TP_MAX_TPDUSIZE)
- dusize = TP_DFL_TPDUSIZE;
+ case TPP_tpdu_size:
+ vb_getval(P, u_char, dusize);
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
+ printf("CR dusize 0x%x\n", dusize);
+ }
+#endif
+ /* COS tests: NBS IA (Dec. 1987) Sec. 4.5.2.1 */
+ if (dusize < TP_MIN_TPDUSIZE || dusize > TP_MAX_TPDUSIZE)
+ dusize = TP_DFL_TPDUSIZE;
+ break;
+ case TPP_ptpdu_size:
+ switch (vbptr(P)->tpv_len) {
+ case 1:
+ pdusize = vbval(P, u_char);
break;
- case TPP_ptpdu_size:
- switch (vbptr(P)->tpv_len) {
- case 1: pdusize = vbval(P, u_char); break;
- case 2: pdusize = ntohs(vbval(P, u_short)); break;
- default: ;
- IFDEBUG(D_TPINPUT)
+ case 2:
+ pdusize = ntohs(vbval(P, u_short));
+ break;
+ default:;
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
printf("malformed prefered TPDU option\n");
- ENDDEBUG
}
- break;
- case TPP_addl_opt:
- vb_getval(P, u_char, addlopt);
- break;
- case TPP_calling_sufx:
- /* could use vb_getval, but we want to save the loc & len
- * for later use
- */
- fsufxloc = (caddr_t) &vbptr(P)->tpv_val;
- fsufxlen = vbptr(P)->tpv_len;
- IFDEBUG(D_TPINPUT)
- printf("CR fsufx:");
- { register int j;
- for(j=0; j<fsufxlen; j++ ) {
- printf(" 0x%x. ", *((caddr_t)(fsufxloc+j)) );
- }
- printf("\n");
- }
- ENDDEBUG
- break;
- case TPP_called_sufx:
- /* could use vb_getval, but we want to save the loc & len
- * for later use
- */
- lsufxloc = (caddr_t) &vbptr(P)->tpv_val;
- lsufxlen = vbptr(P)->tpv_len;
- IFDEBUG(D_TPINPUT)
- printf("CR lsufx:");
- { register int j;
- for(j=0; j<lsufxlen; j++ ) {
- printf(" 0x%x. ", *((u_char *)(lsufxloc+j)) );
- }
- printf("\n");
+#endif
+ }
+ break;
+ case TPP_addl_opt:
+ vb_getval(P, u_char, addlopt);
+ break;
+ case TPP_calling_sufx:
+ /*
+ * could use vb_getval, but we want to save the loc &
+ * len for later use
+ */
+ fsufxloc = (caddr_t) & vbptr(P)->tpv_val;
+ fsufxlen = vbptr(P)->tpv_len;
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
+ printf("CR fsufx:");
+ {
+ register int j;
+ for (j = 0; j < fsufxlen; j++) {
+ printf(" 0x%x. ", *((caddr_t) (fsufxloc + j)));
}
- ENDDEBUG
- break;
-
-#ifdef TP_PERF_MEAS
- case TPP_perf_meas:
- vb_getval(P, u_char, perf_meas);
- break;
-#endif /* TP_PERF_MEAS */
-
- case TPP_vers:
- /* not in class 0; 1 octet; in CR_TPDU only */
- /* COS tests says if version wrong, use default version!?XXX */
- CHECK( (vbval(P, u_char) != TP_VERSION ),
- E_TP_INV_PVAL, ts_inv_pval, setversion,
- (1 + (caddr_t)&vbptr(P)->tpv_val - (caddr_t)hdr) );
- setversion:
- version = vbval(P, u_char);
- break;
- case TPP_acktime:
- vb_getval(P, u_short, acktime);
- acktime = ntohs(acktime);
- acktime = acktime/500; /* convert to slowtimo ticks */
- if((short)acktime <=0 )
- acktime = 2; /* don't allow a bad peer to screw us up */
- IFDEBUG(D_TPINPUT)
- printf("CR acktime 0x%x\n", acktime);
- ENDDEBUG
- break;
-
- case TPP_alt_class:
+ printf("\n");
+ }
+ }
+#endif
+ break;
+ case TPP_called_sufx:
+ /*
+ * could use vb_getval, but we want to save the loc &
+ * len for later use
+ */
+ lsufxloc = (caddr_t) & vbptr(P)->tpv_val;
+ lsufxlen = vbptr(P)->tpv_len;
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
+ printf("CR lsufx:");
{
- u_char *aclass = 0;
- register int i;
- static u_char bad_alt_classes[5] =
- { ~0, ~3, ~5, ~0xf, ~0x1f};
-
- aclass =
- (u_char *) &(((struct tp_vbp *)P)->tpv_val);
- for (i = ((struct tp_vbp *)P)->tpv_len; i>0; i--) {
- alt_classes |= (1<<((*aclass++)>>4));
+ register int j;
+ for (j = 0; j < lsufxlen; j++) {
+ printf(" 0x%x. ", *((u_char *) (lsufxloc + j)));
}
- CHECK( (bad_alt_classes[hdr->tpdu_CRclass] & alt_classes),
- E_TP_INV_PVAL, ts_inv_aclass, respond,
- ((caddr_t)aclass) - (caddr_t)hdr);
- IFDEBUG(D_TPINPUT)
- printf("alt_classes 0x%x\n", alt_classes);
- ENDDEBUG
+ printf("\n");
}
- break;
+ }
+#endif
+ break;
- case TPP_security:
- case TPP_residER:
- case TPP_priority:
- case TPP_transdelay:
- case TPP_throughput:
- case TPP_addl_info:
- case TPP_subseq:
- default:
- IFDEBUG(D_TPINPUT)
- printf("param ignored CR_TPDU code= 0x%x\n",
- vbptr(P)->tpv_code);
- ENDDEBUG
- IncStat(ts_param_ignored);
- break;
+#ifdef TP_PERF_MEAS
+ case TPP_perf_meas:
+ vb_getval(P, u_char, perf_meas);
+ break;
+#endif /* TP_PERF_MEAS */
+
+ case TPP_vers:
+ /* not in class 0; 1 octet; in CR_TPDU only */
+ /*
+ * COS tests says if version wrong, use default
+ * version!?XXX
+ */
+ CHECK((vbval(P, u_char) != TP_VERSION),
+ E_TP_INV_PVAL, ts_inv_pval, setversion,
+ (1 + (caddr_t) & vbptr(P)->tpv_val - (caddr_t) hdr));
+ setversion:
+ version = vbval(P, u_char);
+ break;
+ case TPP_acktime:
+ vb_getval(P, u_short, acktime);
+ acktime = ntohs(acktime);
+ acktime = acktime / 500; /* convert to slowtimo
+ * ticks */
+ if ((short) acktime <= 0)
+ acktime = 2; /* don't allow a bad peer to
+ * screw us up */
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
+ printf("CR acktime 0x%x\n", acktime);
+ }
+#endif
+ break;
- case TPP_checksum:
- IFDEBUG(D_TPINPUT)
- printf("CR before cksum\n");
- ENDDEBUG
+ case TPP_alt_class:
+ {
+ u_char *aclass = 0;
+ register int i;
+ static u_char bad_alt_classes[5] =
+ {~0, ~3, ~5, ~0xf, ~0x1f};
+
+ aclass =
+ (u_char *) & (((struct tp_vbp *) P)->tpv_val);
+ for (i = ((struct tp_vbp *) P)->tpv_len; i > 0; i--) {
+ alt_classes |= (1 << ((*aclass++) >> 4));
+ }
+ CHECK((bad_alt_classes[hdr->tpdu_CRclass] & alt_classes),
+ E_TP_INV_PVAL, ts_inv_aclass, respond,
+ ((caddr_t) aclass) - (caddr_t) hdr);
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
+ printf("alt_classes 0x%x\n", alt_classes);
+ }
+#endif
+ }
+ break;
- CHECK( iso_check_csum(m, tpdu_len),
- E_TP_INV_PVAL, ts_bad_csum, discard, 0)
+ case TPP_security:
+ case TPP_residER:
+ case TPP_priority:
+ case TPP_transdelay:
+ case TPP_throughput:
+ case TPP_addl_info:
+ case TPP_subseq:
+ default:
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
+ printf("param ignored CR_TPDU code= 0x%x\n",
+ vbptr(P)->tpv_code);
+ }
+#endif
+ IncStat(ts_param_ignored);
+ break;
- IFDEBUG(D_TPINPUT)
- printf("CR before cksum\n");
- ENDDEBUG
- break;
+ case TPP_checksum:
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
+ printf("CR before cksum\n");
}
+#endif
- /* } */ END_WHILE_OPTIONS(P)
+ CHECK(iso_check_csum(m, tpdu_len),
+ E_TP_INV_PVAL, ts_bad_csum, discard, 0)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
+ printf("CR before cksum\n");
+ }
+#endif
+ break;
+ }
- if (lsufxlen == 0) {
+ /* } */ END_WHILE_OPTIONS(P)
+ if (lsufxlen == 0) {
/* can't look for a tpcb w/o any called sufx */
- error = E_TP_LENGTH_INVAL;
+ error = E_TP_LENGTH_INVAL;
IncStat(ts_inv_sufx);
goto respond;
} else {
* listen over any network service provider,
* (cons or clns or ip).
*/
- for (t = tp_listeners; t ; t = t->tp_nextlisten)
+ for (t = tp_listeners; t; t = t->tp_nextlisten)
if ((t->tp_lsuffixlen == 0 ||
- (lsufxlen == t->tp_lsuffixlen &&
- bcmp(lsufxloc, t->tp_lsuffix, lsufxlen) == 0)) &&
- ((t->tp_flags & TPF_GENERAL_ADDR) ||
- (laddr->sa_family == t->tp_domain &&
- (*t->tp_nlproto->nlp_cmpnetaddr)
- (t->tp_npcb, laddr, TP_LOCAL))))
+ (lsufxlen == t->tp_lsuffixlen &&
+ bcmp(lsufxloc, t->tp_lsuffix, lsufxlen) == 0)) &&
+ ((t->tp_flags & TPF_GENERAL_ADDR) ||
+ (laddr->sa_family == t->tp_domain &&
+ (*t->tp_nlproto->nlp_cmpnetaddr)
+ (t->tp_npcb, laddr, TP_LOCAL))))
break;
CHECK(t == 0, E_TP_NO_SESSION, ts_inv_sufx, respond,
- (1 + 2 + (caddr_t)&hdr->_tpduf - (caddr_t)hdr))
- /* _tpduf is the fixed part; add 2 to get the dref bits of
- * the fixed part (can't take the address of a bit field)
- */
- IFDEBUG(D_TPINPUT)
+ (1 + 2 + (caddr_t) & hdr->_tpduf - (caddr_t) hdr))
+ /*
+ * _tpduf is the fixed part; add 2 to get the dref
+ * bits of the fixed part (can't take the address of
+ * a bit field)
+ */
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
printf("checking if dup CR\n");
- ENDDEBUG
+ }
+#endif
tpcb = t;
for (t = tpcb->tp_next; t != tpcb; t = t->tp_next) {
if (sref != t->tp_fref)
continue;
- if ((*tpcb->tp_nlproto->nlp_cmpnetaddr)(
- t->tp_npcb, faddr, TP_FOREIGN)) {
- IFDEBUG(D_TPINPUT)
+ if ((*tpcb->tp_nlproto->nlp_cmpnetaddr) (
+ t->tp_npcb, faddr, TP_FOREIGN)) {
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
printf("duplicate CR discarded\n");
- ENDDEBUG
+ }
+#endif
goto discard;
}
}
- IFTRACE(D_TPINPUT)
- tptrace(TPPTmisc, "tp_input: tpcb *lsufxloc tpstate",
+#ifdef TPPT
+ if (tp_traceflags[D_TPINPUT]) {
+ tptrace(TPPTmisc, "tp_input: tpcb *lsufxloc tpstate",
tpcb, *lsufxloc, tpcb->tp_state, 0);
- ENDTRACE
+ }
+#endif
}
- /*
- * WE HAVE A TPCB
- * already know that the classes in the CR match at least
- * one class implemented, but we don't know yet if they
- * include any classes permitted by this server.
+ /*
+ * WE HAVE A TPCB already know that the classes in the CR
+ * match at least one class implemented, but we don't know
+ * yet if they include any classes permitted by this server.
*/
- IFDEBUG(D_TPINPUT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
printf("HAVE A TPCB 1: 0x%x\n", tpcb);
- ENDDEBUG
- IFDEBUG(D_CONN)
+ }
+#endif
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
printf(
-"CR: bef CHKS: flags 0x%x class_to_use 0x%x alt 0x%x opt 0x%x tp_class 0x%x\n",
- tpcb->tp_flags, class_to_use, alt_classes, opt, tpcb->tp_class);
- ENDDEBUG
+ "CR: bef CHKS: flags 0x%x class_to_use 0x%x alt 0x%x opt 0x%x tp_class 0x%x\n",
+ tpcb->tp_flags, class_to_use, alt_classes, opt, tpcb->tp_class);
+ }
+#endif
/* tpcb->tp_class doesn't include any classes not implemented */
class_to_use = (preferred_class & tpcb->tp_class);
- if( (class_to_use = preferred_class & tpcb->tp_class) == 0 )
+ if ((class_to_use = preferred_class & tpcb->tp_class) == 0)
class_to_use = alt_classes & tpcb->tp_class;
class_to_use = 1 << tp_mask_to_num(class_to_use);
tpp.p_ptpdusize = pdusize;
tpp.p_xtd_format = (opt & TPO_XTD_FMT) == TPO_XTD_FMT;
tpp.p_xpd_service = (addlopt & TPAO_USE_TXPD) == TPAO_USE_TXPD;
- tpp.p_use_checksum = (tpp.p_class == TP_CLASS_0)?0:
+ tpp.p_use_checksum = (tpp.p_class == TP_CLASS_0) ? 0 :
(addlopt & TPAO_NO_CSUM) == 0;
tpp.p_version = version;
#ifdef notdef
tpp.p_use_efc = (opt & TPO_USE_EFC) == TPO_USE_EFC;
tpp.p_use_nxpd = (addlopt & TPAO_USE_NXPD) == TPAO_USE_NXPD;
tpp.p_use_rcc = (addlopt & TPAO_USE_RCC) == TPAO_USE_RCC;
-#endif /* notdef */
+#endif /* notdef */
- CHECK(
- tp_consistency(tpcb, 0 /* not force or strict */, &tpp) != 0,
+ CHECK(
+ tp_consistency(tpcb, 0 /* not force or strict */ , &tpp) != 0,
E_TP_NEGOT_FAILED, ts_negotfailed, clear_parent_tcb,
- (1 + 2 + (caddr_t)&hdr->_tpdufr.CRCC - (caddr_t)hdr)
- /* ^ more or less the location of class */
- )
+ (1 + 2 + (caddr_t) & hdr->_tpdufr.CRCC - (caddr_t) hdr)
+ /* ^ more or less the location of class */
+ )
}
- IFTRACE(D_CONN)
- tptrace(TPPTmisc,
- "after 1 consist class_to_use class, out, tpconsout",
- class_to_use,
+#ifdef TPPT
+ if (tp_traceflags[D_CONN]) {
+ tptrace(TPPTmisc,
+ "after 1 consist class_to_use class, out, tpconsout",
+ class_to_use,
tpcb->tp_class, dgout_routine, tpcons_output
- );
- ENDTRACE
- CHECK(
- ((class_to_use == TP_CLASS_0)&&(dgout_routine != tpcons_output)),
+ );
+ }
+#endif
+ CHECK(((class_to_use == TP_CLASS_0) &&
+ (dgout_routine != tpcons_output)),
E_TP_NEGOT_FAILED, ts_negotfailed, clear_parent_tcb,
- (1 + 2 + (caddr_t)&hdr->_tpdufr.CRCC - (caddr_t)hdr)
- /* ^ more or less the location of class */
+ (1 + 2 + (caddr_t) & hdr->_tpdufr.CRCC - (caddr_t) hdr)
+ /* ^ more or less the location of class */
)
- IFDEBUG(D_CONN)
- printf("CR: after CRCCCHECKS: tpcb 0x%x, flags 0x%x\n",
- tpcb, tpcb->tp_flags);
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
+ printf("CR: after CRCCCHECKS: tpcb 0x%x, flags 0x%x\n",
+ tpcb, tpcb->tp_flags);
+ }
+#endif
takes_data = TRUE;
- e.ATTR(CR_TPDU).e_cdt = hdr->tpdu_CRcdt;
+ e.TPDU_ATTR(CR).e_cdt = hdr->tpdu_CRcdt;
e.ev_number = CR_TPDU;
so = tpcb->tp_sock;
if (so->so_options & SO_ACCEPTCONN) {
- struct tp_pcb *parent_tpcb = tpcb;
- /*
- * Create a socket, tpcb, ll pcb, etc.
- * for this newborn connection, and fill in all the values.
+ struct tp_pcb *parent_tpcb = tpcb;
+ /*
+ * Create a socket, tpcb, ll pcb, etc. for this
+ * newborn connection, and fill in all the values.
*/
- IFDEBUG(D_CONN)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
printf("abt to call tp_newsocket(0x%x, 0x%x, 0x%x, 0x%x)\n",
- so, laddr, faddr, cons_channel);
- ENDDEBUG
- if( (so =
- tp_newsocket(so, faddr, cons_channel,
- class_to_use,
- ((tpcb->tp_netservice == IN_CLNS) ? IN_CLNS :
- (dgout_routine == tpcons_output)?ISO_CONS:ISO_CLNS))
- ) == (struct socket *)0 ) {
- /* note - even if netservice is IN_CLNS, as far as
- * the tp entity is concerned, the only differences
- * are CO vs CL
+ so, laddr, faddr, cons_channel);
+ }
+#endif
+ if ((so =
+ tp_newsocket(so, faddr, cons_channel,
+ class_to_use,
+ ((tpcb->tp_netservice == IN_CLNS) ? IN_CLNS :
+ (dgout_routine == tpcons_output) ? ISO_CONS : ISO_CLNS))
+ ) == (struct socket *) 0) {
+ /*
+ * note - even if netservice is IN_CLNS, as
+ * far as the tp entity is concerned, the
+ * only differences are CO vs CL
*/
- IFDEBUG(D_CONN)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
printf("tp_newsocket returns 0\n");
- ENDDEBUG
+ }
+#endif
goto discard;
- clear_parent_tcb:
+ clear_parent_tcb:
tpcb = 0;
goto respond;
}
insque(tpcb, parent_tpcb);
/*
- * Stash the addresses in the net level pcb
+ * Stash the addresses in the net level pcb
* kind of like a pcbconnect() but don't need
* or want all those checks.
*/
- (tpcb->tp_nlproto->nlp_putnetaddr)(tpcb->tp_npcb, faddr, TP_FOREIGN);
- (tpcb->tp_nlproto->nlp_putnetaddr)(tpcb->tp_npcb, laddr, TP_LOCAL);
+ (tpcb->tp_nlproto->nlp_putnetaddr) (tpcb->tp_npcb, faddr, TP_FOREIGN);
+ (tpcb->tp_nlproto->nlp_putnetaddr) (tpcb->tp_npcb, laddr, TP_LOCAL);
/* stash the f suffix in the new tpcb */
- if (tpcb->tp_fsuffixlen = fsufxlen) {
+ if ((tpcb->tp_fsuffixlen = fsufxlen) != 0) {
bcopy(fsufxloc, tpcb->tp_fsuffix, fsufxlen);
(tpcb->tp_nlproto->nlp_putsufx)
- (tpcb->tp_npcb, fsufxloc, fsufxlen, TP_FOREIGN);
+ (tpcb->tp_npcb, fsufxloc, fsufxlen, TP_FOREIGN);
}
/* stash the l suffix in the new tpcb */
tpcb->tp_lsuffixlen = lsufxlen;
bcopy(lsufxloc, tpcb->tp_lsuffix, lsufxlen);
(tpcb->tp_nlproto->nlp_putsufx)
- (tpcb->tp_npcb, lsufxloc, lsufxlen, TP_LOCAL);
+ (tpcb->tp_npcb, lsufxloc, lsufxlen, TP_LOCAL);
#ifdef TP_PERF_MEAS
- if( tpcb->tp_perf_on = perf_meas ) { /* assignment */
- /* ok, let's create an mbuf for stashing the
- * statistics if one doesn't already exist
+ if (tpcb->tp_perf_on = perf_meas) { /* assignment */
+ /*
+ * ok, let's create an mbuf for stashing the
+ * statistics if one doesn't already exist
*/
(void) tp_setup_perf(tpcb);
}
-#endif /* TP_PERF_MEAS */
+#endif /* TP_PERF_MEAS */
tpcb->tp_fref = sref;
- /* We've already checked for consistency with the options
- * set in tpp, but we couldn't set them earlier because
- * we didn't want to change options in the LISTENING tpcb.
- * Now we set the options in the new socket's tpcb.
+ /*
+ * We've already checked for consistency with the
+ * options set in tpp, but we couldn't set them
+ * earlier because we didn't want to change options
+ * in the LISTENING tpcb. Now we set the options in
+ * the new socket's tpcb.
*/
- (void) tp_consistency( tpcb, TP_FORCE, &tpp);
+ (void) tp_consistency(tpcb, TP_FORCE, &tpp);
- if(!tpcb->tp_use_checksum)
+ if (!tpcb->tp_use_checksum)
IncStat(ts_csum_off);
- if(tpcb->tp_xpd_service)
+ if (tpcb->tp_xpd_service)
IncStat(ts_use_txpd);
- if(tpcb->tp_xtd_format)
+ if (tpcb->tp_xtd_format)
IncStat(ts_xtd_fmt);
tpcb->tp_peer_acktime = acktime;
- /*
- * The following kludge is used to test retransmissions and
- * timeout during connection establishment.
+ /*
+ * The following kludge is used to test
+ * retransmissions and timeout during connection
+ * establishment.
*/
- IFDEBUG(D_ZDREF)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ZDREF]) {
IncStat(ts_zdebug);
- /*tpcb->tp_fref = 0;*/
- ENDDEBUG
+ /* tpcb->tp_fref = 0; */
+ }
+#endif
}
LOCAL_CREDIT(tpcb);
IncStat(ts_CR_rcvd);
CONG_INIT_SAMPLE(tpcb);
CONG_UPDATE_SAMPLE(tpcb, ce_bit);
}
- } else if ( dutype == ER_TPDU_type ) {
- /*
- * ER TPDUs have to be recognized separately
- * because they don't necessarily have a tpcb
- * with them and we don't want err out looking for such
- * a beast.
- * We could put a bunch of little kludges in the
- * next section of code so it would avoid references to tpcb
- * if dutype == ER_TPDU_type but we don't want code for ERs to
- * mess up code for data transfer.
+ } else if (dutype == ER_TPDU_type) {
+ /*
+ * ER TPDUs have to be recognized separately because they
+ * don't necessarily have a tpcb with them and we don't want
+ * err out looking for such a beast. We could put a bunch of
+ * little kludges in the next section of code so it would
+ * avoid references to tpcb if dutype == ER_TPDU_type but we
+ * don't want code for ERs to mess up code for data transfer.
*/
IncStat(ts_ER_rcvd);
e.ev_number = ER_TPDU;
- e.ATTR(ER_TPDU).e_reason = (u_char)hdr->tpdu_ERreason;
- CHECK (((int)dref <= 0 || dref >= tp_refinfo.tpr_size ||
- (tpcb = tp_ref[dref].tpr_pcb ) == (struct tp_pcb *) 0 ||
- tpcb->tp_refstate == REF_FREE ||
- tpcb->tp_refstate == REF_FROZEN),
- E_TP_MISM_REFS, ts_inv_dref, discard, 0)
-
+ e.TPDU_ATTR(ER).e_reason = (u_char) hdr->tpdu_ERreason;
+ CHECK(((int) dref <= 0 || dref >= tp_refinfo.tpr_size ||
+ (tpcb = tp_ref[dref].tpr_pcb) == (struct tp_pcb *) 0 ||
+ tpcb->tp_refstate == REF_FREE ||
+ tpcb->tp_refstate == REF_FROZEN),
+ E_TP_MISM_REFS, ts_inv_dref, discard, 0)
} else {
/* tpdu type is CC, XPD, XAK, GR, AK, DR, DC, or DT */
- /* In the next 4 checks,
- * _tpduf is the fixed part; add 2 to get the dref bits of
- * the fixed part (can't take the address of a bit field)
+ /*
+ * In the next 4 checks, _tpduf is the fixed part; add 2 to
+ * get the dref bits of the fixed part (can't take the
+ * address of a bit field)
*/
#ifdef TPCONS
if (cons_channel && dutype == DT_TPDU_type) {
- struct isopcb *isop = ((struct isopcb *)
- ((struct pklcd *)cons_channel)->lcd_upnext);
+ struct isopcb *isop = ((struct isopcb *)
+ ((struct pklcd *) cons_channel)->lcd_upnext);
if (isop && isop->isop_refcnt == 1 && isop->isop_socket &&
- (tpcb = sototpcb(isop->isop_socket)) &&
- (tpcb->tp_class == TP_CLASS_0/* || == CLASS_1 */)) {
- IFDEBUG(D_TPINPUT)
+ (tpcb = sototpcb(isop->isop_socket)) &&
+ (tpcb->tp_class == TP_CLASS_0 /* || == CLASS_1 */ )) {
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
printf("tpinput_dt: class 0 short circuit\n");
- ENDDEBUG
+ }
+#endif
dref = tpcb->tp_lref;
sref = tpcb->tp_fref;
- CHECK( (tpcb->tp_refstate == REF_FREE),
- E_TP_MISM_REFS,ts_inv_dref, nonx_dref,
- (1 + 2 + (caddr_t)&hdr->_tpduf - (caddr_t)hdr))
- goto tp0_data;
+ CHECK((tpcb->tp_refstate == REF_FREE),
+ E_TP_MISM_REFS, ts_inv_dref, nonx_dref,
+ (1 + 2 + (caddr_t) & hdr->_tpduf - (caddr_t) hdr))
+ goto tp0_data;
}
-
}
#endif
{
- CHECK( ((int)dref <= 0 || dref >= tp_refinfo.tpr_size) ,
- E_TP_MISM_REFS,ts_inv_dref, nonx_dref,
- (1 + 2 + (caddr_t)&hdr->_tpduf - (caddr_t)hdr))
- CHECK( ((tpcb = tp_ref[dref].tpr_pcb ) == (struct tp_pcb *) 0 ),
- E_TP_MISM_REFS,ts_inv_dref, nonx_dref,
- (1 + 2 + (caddr_t)&hdr->_tpduf - (caddr_t)hdr))
- CHECK( (tpcb->tp_refstate == REF_FREE),
- E_TP_MISM_REFS,ts_inv_dref, nonx_dref,
- (1 + 2 + (caddr_t)&hdr->_tpduf - (caddr_t)hdr))
+ CHECK(((int) dref <= 0 || dref >= tp_refinfo.tpr_size),
+ E_TP_MISM_REFS, ts_inv_dref, nonx_dref,
+ (1 + 2 + (caddr_t) & hdr->_tpduf - (caddr_t) hdr))
+ CHECK(((tpcb = tp_ref[dref].tpr_pcb) == (struct tp_pcb *) 0),
+ E_TP_MISM_REFS, ts_inv_dref, nonx_dref,
+ (1 + 2 + (caddr_t) & hdr->_tpduf - (caddr_t) hdr))
+ CHECK((tpcb->tp_refstate == REF_FREE),
+ E_TP_MISM_REFS, ts_inv_dref, nonx_dref,
+ (1 + 2 + (caddr_t) & hdr->_tpduf - (caddr_t) hdr))
}
- IFDEBUG(D_TPINPUT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
printf("HAVE A TPCB 2: 0x%x\n", tpcb);
- ENDDEBUG
+ }
+#endif
/* causes a DR to be sent for CC; ER for all else */
- CHECK( (tpcb->tp_refstate == REF_FROZEN),
- (dutype == CC_TPDU_type?E_TP_NO_SESSION:E_TP_MISM_REFS),
- ts_inv_dref, respond,
- (1 + 2 + (caddr_t)&hdr->_tpduf - (caddr_t)hdr))
-
- IFDEBUG(D_TPINPUT)
- printf("state of dref %d ok, tpcb 0x%x\n", dref,tpcb);
- ENDDEBUG
- /*
- * At this point the state of the dref could be
- * FROZEN: tpr_pcb == NULL, has ( reference only) timers
- * for example, DC may arrive after the close() has detached
- * the tpcb (e.g., if user turned off SO_LISTEN option)
- * OPENING : a tpcb exists but no timers yet
- * OPEN : tpcb exists & timers are outstanding
+ CHECK((tpcb->tp_refstate == REF_FROZEN),
+ (dutype == CC_TPDU_type ? E_TP_NO_SESSION : E_TP_MISM_REFS),
+ ts_inv_dref, respond,
+ (1 + 2 + (caddr_t) & hdr->_tpduf - (caddr_t) hdr))
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
+ printf("state of dref %d ok, tpcb 0x%x\n", dref, tpcb);
+ }
+#endif
+ /*
+ * At this point the state of the dref could be FROZEN:
+ * tpr_pcb == NULL, has ( reference only) timers for
+ * example, DC may arrive after the close() has detached the
+ * tpcb (e.g., if user turned off SO_LISTEN option) OPENING :
+ * a tpcb exists but no timers yet OPEN : tpcb exists &
+ * timers are outstanding
*/
- if (!tpcb->tp_cebit_off)
- CONG_UPDATE_SAMPLE(tpcb, ce_bit);
+ if (!tpcb->tp_cebit_off)
+ CONG_UPDATE_SAMPLE(tpcb, ce_bit);
dusize = tpcb->tp_tpdusize;
pdusize = tpcb->tp_ptpdusize;
- dutype = hdr->tpdu_type << 8; /* for the switch below */
-
- WHILE_OPTIONS(P, hdr, tpcb->tp_xtd_format) /* { */
+ dutype = hdr->tpdu_type << 8; /* for the switch below */
+ WHILE_OPTIONS(P, hdr, tpcb->tp_xtd_format) /* { */
#define caseof(x,y) case (((x)<<8)+(y))
- switch( dutype | vbptr(P)->tpv_code ) {
+ switch (dutype | vbptr(P)->tpv_code) {
- caseof( CC_TPDU_type, TPP_addl_opt ):
- /* not in class 0; 1 octet */
- vb_getval(P, u_char, addlopt);
- break;
- caseof( CC_TPDU_type, TPP_tpdu_size ):
- {
- u_char odusize = dusize;
- vb_getval(P, u_char, dusize);
- CHECK( (dusize < TP_MIN_TPDUSIZE ||
- dusize > TP_MAX_TPDUSIZE || dusize > odusize),
- E_TP_INV_PVAL, ts_inv_pval, respond,
- (1 + (caddr_t)&vbptr(P)->tpv_val - (caddr_t)hdr) )
- IFDEBUG(D_TPINPUT)
- printf("CC dusize 0x%x\n", dusize);
- ENDDEBUG
+ caseof(CC_TPDU_type, TPP_addl_opt):
+ /* not in class 0; 1 octet */
+ vb_getval(P, u_char, addlopt);
+ break;
+ caseof(CC_TPDU_type, TPP_tpdu_size):
+ {
+ u_char odusize = dusize;
+ vb_getval(P, u_char, dusize);
+ CHECK((dusize < TP_MIN_TPDUSIZE ||
+ dusize > TP_MAX_TPDUSIZE || dusize > odusize),
+ E_TP_INV_PVAL, ts_inv_pval, respond,
+ (1 + (caddr_t) & vbptr(P)->tpv_val - (caddr_t) hdr))
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
+ printf("CC dusize 0x%x\n", dusize);
}
+#endif
+ }
+ break;
+ caseof(CC_TPDU_type, TPP_ptpdu_size):
+ {
+ u_short opdusize = pdusize;
+ switch (vbptr(P)->tpv_len) {
+ case 1:
+ pdusize = vbval(P, u_char);
break;
- caseof( CC_TPDU_type, TPP_ptpdu_size ):
- {
- u_short opdusize = pdusize;
- switch (vbptr(P)->tpv_len) {
- case 1: pdusize = vbval(P, u_char); break;
- case 2: pdusize = ntohs(vbval(P, u_short)); break;
- default: ;
- IFDEBUG(D_TPINPUT)
+ case 2:
+ pdusize = ntohs(vbval(P, u_short));
+ break;
+ default:;
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
printf("malformed prefered TPDU option\n");
- ENDDEBUG
}
- CHECK( (pdusize == 0 ||
- (opdusize && (pdusize > opdusize))),
- E_TP_INV_PVAL, ts_inv_pval, respond,
- (1 + (caddr_t)&vbptr(P)->tpv_val - (caddr_t)hdr) )
+#endif
}
- break;
- caseof( CC_TPDU_type, TPP_calling_sufx):
- IFDEBUG(D_TPINPUT)
- printf("CC calling (local) sufxlen 0x%x\n", lsufxlen);
- ENDDEBUG
- lsufxloc = (caddr_t) &vbptr(P)->tpv_val;
- lsufxlen = vbptr(P)->tpv_len;
- break;
- caseof( CC_TPDU_type, TPP_acktime ):
- /* class 4 only, 2 octets */
- vb_getval(P, u_short, acktime);
- acktime = ntohs(acktime);
- acktime = acktime/500; /* convert to slowtimo ticks */
- if( (short)acktime <=0 )
- acktime = 2;
- break;
- caseof( CC_TPDU_type, TPP_called_sufx):
- fsufxloc = (caddr_t) &vbptr(P)->tpv_val;
- fsufxlen = vbptr(P)->tpv_len;
- IFDEBUG(D_TPINPUT)
- printf("CC called (foreign) sufx len %d\n", fsufxlen);
- ENDDEBUG
- break;
+ CHECK((pdusize == 0 ||
+ (opdusize && (pdusize > opdusize))),
+ E_TP_INV_PVAL, ts_inv_pval, respond,
+ (1 + (caddr_t) & vbptr(P)->tpv_val - (caddr_t) hdr))
+ }
+ break;
+ caseof(CC_TPDU_type, TPP_calling_sufx):
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
+ printf("CC calling (local) sufxlen 0x%x\n", lsufxlen);
+ }
+#endif
+ lsufxloc = (caddr_t) & vbptr(P)->tpv_val;
+ lsufxlen = vbptr(P)->tpv_len;
+ break;
+ caseof(CC_TPDU_type, TPP_acktime):
+ /* class 4 only, 2 octets */
+ vb_getval(P, u_short, acktime);
+ acktime = ntohs(acktime);
+ acktime = acktime / 500; /* convert to slowtimo
+ * ticks */
+ if ((short) acktime <= 0)
+ acktime = 2;
+ break;
+ caseof(CC_TPDU_type, TPP_called_sufx):
+ fsufxloc = (caddr_t) & vbptr(P)->tpv_val;
+ fsufxlen = vbptr(P)->tpv_len;
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
+ printf("CC called (foreign) sufx len %d\n", fsufxlen);
+ }
+#endif
+ break;
- caseof( CC_TPDU_type, TPP_checksum):
- caseof( DR_TPDU_type, TPP_checksum):
- caseof( DT_TPDU_type, TPP_checksum):
- caseof( XPD_TPDU_type, TPP_checksum):
- if( tpcb->tp_use_checksum ) {
- CHECK( iso_check_csum(m, tpdu_len),
- E_TP_INV_PVAL, ts_bad_csum, discard, 0)
- }
- break;
+ caseof(CC_TPDU_type, TPP_checksum):
+ caseof(DR_TPDU_type, TPP_checksum):
+ caseof(DT_TPDU_type, TPP_checksum):
+ caseof(XPD_TPDU_type, TPP_checksum):
+ if (tpcb->tp_use_checksum) {
+ CHECK(iso_check_csum(m, tpdu_len),
+ E_TP_INV_PVAL, ts_bad_csum, discard, 0)
+ }
+ break;
- /* this is different from the above because in the context
- * of concat/ sep tpdu_len might not be the same as hdr len
+ /*
+ * this is different from the above because in the
+ * context of concat/ sep tpdu_len might not be the
+ * same as hdr len
*/
- caseof( AK_TPDU_type, TPP_checksum):
- caseof( XAK_TPDU_type, TPP_checksum):
- caseof( DC_TPDU_type, TPP_checksum):
- if( tpcb->tp_use_checksum ) {
- CHECK( iso_check_csum(m, (int)hdr->tpdu_li + 1),
- E_TP_INV_PVAL, ts_bad_csum, discard, 0)
- }
- break;
+ caseof(AK_TPDU_type, TPP_checksum):
+ caseof(XAK_TPDU_type, TPP_checksum):
+ caseof(DC_TPDU_type, TPP_checksum):
+ if (tpcb->tp_use_checksum) {
+ CHECK(iso_check_csum(m, (int) hdr->tpdu_li + 1),
+ E_TP_INV_PVAL, ts_bad_csum, discard, 0)
+ }
+ break;
#ifdef notdef
- caseof( DR_TPDU_type, TPP_addl_info ):
- /* ignore - its length and meaning are
- * user defined and there's no way
- * to pass this info to the user anyway
- */
- break;
-#endif /* notdef */
-
- caseof( AK_TPDU_type, TPP_subseq ):
- /* used after reduction of window */
- vb_getval(P, u_short, subseq);
- subseq = ntohs(subseq);
- IFDEBUG(D_ACKRECV)
- printf("AK dref 0x%x Subseq 0x%x\n", dref, subseq);
- ENDDEBUG
- break;
+ caseof(DR_TPDU_type, TPP_addl_info):
+ /*
+ * ignore - its length and meaning are user defined
+ * and there's no way to pass this info to the user
+ * anyway
+ */
+ break;
+#endif /* notdef */
- caseof( AK_TPDU_type, TPP_flow_cntl_conf ):
- {
- u_int ylwe;
- u_short ysubseq, ycredit;
-
- fcc_present = TRUE;
- vb_getval(P, u_int, ylwe);
- vb_getval(P, u_short, ysubseq);
- vb_getval(P, u_short, ycredit);
- ylwe = ntohl(ylwe);
- ysubseq = ntohs(ysubseq);
- ycredit = ntohs(ycredit);
- IFDEBUG(D_ACKRECV)
- printf("%s%x, subseq 0x%x, cdt 0x%x dref 0x%x\n",
- "AK FCC lwe 0x", ylwe, ysubseq, ycredit, dref);
- ENDDEBUG
+ caseof(AK_TPDU_type, TPP_subseq):
+ /* used after reduction of window */
+ vb_getval(P, u_short, subseq);
+ subseq = ntohs(subseq);
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ACKRECV]) {
+ printf("AK dref 0x%x Subseq 0x%x\n", dref, subseq);
+ }
+#endif
+ break;
+
+ caseof(AK_TPDU_type, TPP_flow_cntl_conf):
+ {
+ u_int ylwe;
+ u_short ysubseq, ycredit;
+
+ fcc_present = TRUE;
+ vb_getval(P, u_int, ylwe);
+ vb_getval(P, u_short, ysubseq);
+ vb_getval(P, u_short, ycredit);
+ ylwe = ntohl(ylwe);
+ ysubseq = ntohs(ysubseq);
+ ycredit = ntohs(ycredit);
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ACKRECV]) {
+ printf("%s%x, subseq 0x%x, cdt 0x%x dref 0x%x\n",
+ "AK FCC lwe 0x", ylwe, ysubseq, ycredit, dref);
}
- break;
+#endif
+ }
+ break;
- default:
- IFDEBUG(D_TPINPUT)
- printf("param ignored dutype 0x%x, code 0x%x\n",
- dutype, vbptr(P)->tpv_code);
- ENDDEBUG
- IFTRACE(D_TPINPUT)
- tptrace(TPPTmisc, "param ignored dutype code ",
- dutype, vbptr(P)->tpv_code ,0,0);
- ENDTRACE
- IncStat(ts_param_ignored);
- break;
+ default:
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
+ printf("param ignored dutype 0x%x, code 0x%x\n",
+ dutype, vbptr(P)->tpv_code);
+ }
+#endif
+#ifdef TPPT
+ if (tp_traceflags[D_TPINPUT]) {
+ tptrace(TPPTmisc, "param ignored dutype code ",
+ dutype, vbptr(P)->tpv_code, 0, 0);
+ }
+#endif
+ IncStat(ts_param_ignored);
+ break;
#undef caseof
}
- /* } */ END_WHILE_OPTIONS(P)
-
+ /* } */ END_WHILE_OPTIONS(P)
/* NOTE: the variable dutype has been shifted left! */
- switch( hdr->tpdu_type ) {
- case CC_TPDU_type:
- /* If CC comes back with an unacceptable class
+ switch (hdr->tpdu_type) {
+ case CC_TPDU_type:
+ /*
+ * If CC comes back with an unacceptable class
* respond with a DR or ER
*/
- opt = hdr->tpdu_CCoptions; /* 1 byte */
+ opt = hdr->tpdu_CCoptions; /* 1 byte */
{
tpp = tpcb->_tp_param;
- tpp.p_class = (1<<hdr->tpdu_CCclass);
+ tpp.p_class = (1 << hdr->tpdu_CCclass);
tpp.p_tpdusize = dusize;
tpp.p_ptpdusize = pdusize;
tpp.p_dont_change_params = 0;
tpp.p_use_efc = (opt & TPO_USE_EFC) == TPO_USE_EFC;
tpp.p_use_nxpd = (addlopt & TPAO_USE_NXPD) == TPAO_USE_NXPD;
tpp.p_use_rcc = (addlopt & TPAO_USE_RCC) == TPAO_USE_RCC;
-#endif /* notdef */
+#endif /* notdef */
- CHECK(
- tp_consistency(tpcb, TP_FORCE, &tpp) != 0,
- E_TP_NEGOT_FAILED, ts_negotfailed, respond,
- (1 + 2 + (caddr_t)&hdr->_tpdufr.CRCC - (caddr_t)hdr)
- /* ^ more or less the location of class */
- )
- IFTRACE(D_CONN)
- tptrace(TPPTmisc,
- "after 1 consist class, out, tpconsout",
- tpcb->tp_class, dgout_routine, tpcons_output, 0
+ CHECK(
+ tp_consistency(tpcb, TP_FORCE, &tpp) != 0,
+ E_TP_NEGOT_FAILED, ts_negotfailed, respond,
+ (1 + 2 + (caddr_t) & hdr->_tpdufr.CRCC - (caddr_t) hdr)
+ /* ^ more or less the location of class */
+ )
+#ifdef TPPT
+ if (tp_traceflags[D_CONN]) {
+ tptrace(TPPTmisc,
+ "after 1 consist class, out, tpconsout",
+ tpcb->tp_class, dgout_routine, tpcons_output, 0
);
- ENDTRACE
- CHECK(
- ((class_to_use == TP_CLASS_0)&&
- (dgout_routine != tpcons_output)),
- E_TP_NEGOT_FAILED, ts_negotfailed, respond,
- (1 + 2 + (caddr_t)&hdr->_tpdufr.CRCC - (caddr_t)hdr)
- /* ^ more or less the location of class */
- )
+ }
+#endif
+ CHECK(
+ ((class_to_use == TP_CLASS_0) &&
+ (dgout_routine != tpcons_output)),
+ E_TP_NEGOT_FAILED, ts_negotfailed, respond,
+ (1 + 2 + (caddr_t) & hdr->_tpdufr.CRCC - (caddr_t) hdr)
+ /* ^ more or less the location of class */
+ )
#ifdef TPCONS
- if (tpcb->tp_netservice == ISO_CONS &&
- class_to_use == TP_CLASS_0) {
- struct isopcb *isop = (struct isopcb *)tpcb->tp_npcb;
- struct pklcd *lcp = (struct pklcd *)isop->isop_chan;
+ if (tpcb->tp_netservice == ISO_CONS &&
+ class_to_use == TP_CLASS_0) {
+ struct isopcb *isop = (struct isopcb *) tpcb->tp_npcb;
+ struct pklcd *lcp = (struct pklcd *) isop->isop_chan;
lcp->lcd_flags &= ~X25_DG_CIRCUIT;
}
#endif
}
- if( ! tpcb->tp_use_checksum)
+ if (!tpcb->tp_use_checksum)
IncStat(ts_csum_off);
- if(tpcb->tp_xpd_service)
+ if (tpcb->tp_xpd_service)
IncStat(ts_use_txpd);
- if(tpcb->tp_xtd_format)
+ if (tpcb->tp_xtd_format)
IncStat(ts_xtd_fmt);
- IFTRACE(D_CONN)
+#ifdef TPPT
+ if (tp_traceflags[D_CONN]) {
tptrace(TPPTmisc, "after CC class flags dusize CCclass",
- tpcb->tp_class, tpcb->tp_flags, tpcb->tp_tpdusize,
+ tpcb->tp_class, tpcb->tp_flags, tpcb->tp_tpdusize,
hdr->tpdu_CCclass);
- ENDTRACE
+ }
+#endif
- /* if called or calling suffices appeared on the CC,
+ /*
+ * if called or calling suffices appeared on the CC,
* they'd better jive with what's in the pcb
*/
- if( fsufxlen ) {
- CHECK( ((tpcb->tp_fsuffixlen != fsufxlen) ||
- bcmp(fsufxloc, tpcb->tp_fsuffix, fsufxlen)),
- E_TP_INV_PVAL,ts_inv_sufx, respond,
- (1+fsufxloc - (caddr_t)hdr))
+ if (fsufxlen) {
+ CHECK(((tpcb->tp_fsuffixlen != fsufxlen) ||
+ bcmp(fsufxloc, tpcb->tp_fsuffix, fsufxlen)),
+ E_TP_INV_PVAL, ts_inv_sufx, respond,
+ (1 + fsufxloc - (caddr_t) hdr))
}
- if( lsufxlen ) {
- CHECK( ((tpcb->tp_lsuffixlen != lsufxlen) ||
- bcmp(lsufxloc, tpcb->tp_lsuffix, lsufxlen)),
- E_TP_INV_PVAL,ts_inv_sufx, respond,
- (1+lsufxloc - (caddr_t)hdr))
+ if (lsufxlen) {
+ CHECK(((tpcb->tp_lsuffixlen != lsufxlen) ||
+ bcmp(lsufxloc, tpcb->tp_lsuffix, lsufxlen)),
+ E_TP_INV_PVAL, ts_inv_sufx, respond,
+ (1 + lsufxloc - (caddr_t) hdr))
}
-
- e.ATTR(CC_TPDU).e_sref = sref;
- e.ATTR(CC_TPDU).e_cdt = hdr->tpdu_CCcdt;
+ e.TPDU_ATTR(CC).e_sref = sref;
+ e.TPDU_ATTR(CC).e_cdt = hdr->tpdu_CCcdt;
takes_data = TRUE;
e.ev_number = CC_TPDU;
IncStat(ts_CC_rcvd);
case DC_TPDU_type:
if (sref != tpcb->tp_fref)
printf("INPUT: inv sufx DCsref 0x%x, tp_fref 0x%x\n",
- sref, tpcb->tp_fref);
-
- CHECK( (sref != tpcb->tp_fref),
- E_TP_MISM_REFS, ts_inv_sufx, discard,
- (1 + (caddr_t)&hdr->tpdu_DCsref - (caddr_t)hdr))
-
- e.ev_number = DC_TPDU;
+ sref, tpcb->tp_fref);
+
+ CHECK((sref != tpcb->tp_fref),
+ E_TP_MISM_REFS, ts_inv_sufx, discard,
+ (1 + (caddr_t) & hdr->tpdu_DCsref - (caddr_t) hdr))
+ e.ev_number = DC_TPDU;
IncStat(ts_DC_rcvd);
break;
- case DR_TPDU_type:
- IFTRACE(D_TPINPUT)
+ case DR_TPDU_type:
+#ifdef TPPT
+ if (tp_traceflags[D_TPINPUT]) {
tptrace(TPPTmisc, "DR recvd", hdr->tpdu_DRreason, 0, 0, 0);
- ENDTRACE
- if (sref != tpcb->tp_fref) {
+ }
+#endif
+ if (sref != tpcb->tp_fref) {
printf("INPUT: inv sufx DRsref 0x%x tp_fref 0x%x\n",
- sref, tpcb->tp_fref);
+ sref, tpcb->tp_fref);
}
-
- CHECK( (sref != 0 && sref != tpcb->tp_fref &&
- tpcb->tp_state != TP_CRSENT),
- (TP_ERROR_SNDC | E_TP_MISM_REFS),ts_inv_sufx, respond,
- (1 + (caddr_t)&hdr->tpdu_DRsref - (caddr_t)hdr))
-
- e.ATTR(DR_TPDU).e_reason = hdr->tpdu_DRreason;
- e.ATTR(DR_TPDU).e_sref = (u_short)sref;
+ CHECK((sref != 0 && sref != tpcb->tp_fref &&
+ tpcb->tp_state != TP_CRSENT),
+ (TP_ERROR_SNDC | E_TP_MISM_REFS), ts_inv_sufx, respond,
+ (1 + (caddr_t) & hdr->tpdu_DRsref - (caddr_t) hdr))
+ e.TPDU_ATTR(DR).e_reason = hdr->tpdu_DRreason;
+ e.TPDU_ATTR(DR).e_sref = (u_short) sref;
takes_data = TRUE;
e.ev_number = DR_TPDU;
IncStat(ts_DR_rcvd);
break;
case ER_TPDU_type:
- IFTRACE(D_TPINPUT)
- tptrace(TPPTmisc, "ER recvd", hdr->tpdu_ERreason,0,0,0);
- ENDTRACE
- e.ev_number = ER_TPDU;
- e.ATTR(ER_TPDU).e_reason = hdr->tpdu_ERreason;
+#ifdef TPPT
+ if (tp_traceflags[D_TPINPUT]) {
+ tptrace(TPPTmisc, "ER recvd", hdr->tpdu_ERreason, 0, 0, 0);
+ }
+#endif
+ e.ev_number = ER_TPDU;
+ e.TPDU_ATTR(ER).e_reason = hdr->tpdu_ERreason;
IncStat(ts_ER_rcvd);
break;
- case AK_TPDU_type:
+ case AK_TPDU_type:
- e.ATTR(AK_TPDU).e_subseq = subseq;
- e.ATTR(AK_TPDU).e_fcc_present = fcc_present;
+ e.TPDU_ATTR(AK).e_subseq = subseq;
+ e.TPDU_ATTR(AK).e_fcc_present = fcc_present;
if (tpcb->tp_xtd_format) {
#ifdef BYTE_ORDER
- union seq_type seqeotX;
+ union seq_type seqeotX;
seqeotX.s_seqeot = ntohl(hdr->tpdu_seqeotX);
- e.ATTR(AK_TPDU).e_seq = seqeotX.s_seq;
- e.ATTR(AK_TPDU).e_cdt = ntohs(hdr->tpdu_AKcdtX);
+ e.TPDU_ATTR(AK).e_seq = seqeotX.s_seq;
+ e.TPDU_ATTR(AK).e_cdt = ntohs(hdr->tpdu_AKcdtX);
#else
- e.ATTR(AK_TPDU).e_cdt = hdr->tpdu_AKcdtX;
- e.ATTR(AK_TPDU).e_seq = hdr->tpdu_AKseqX;
-#endif /* BYTE_ORDER */
+ e.TPDU_ATTR(AK).e_cdt = hdr->tpdu_AKcdtX;
+ e.TPDU_ATTR(AK).e_seq = hdr->tpdu_AKseqX;
+#endif /* BYTE_ORDER */
} else {
- e.ATTR(AK_TPDU).e_cdt = hdr->tpdu_AKcdt;
- e.ATTR(AK_TPDU).e_seq = hdr->tpdu_AKseq;
+ e.TPDU_ATTR(AK).e_cdt = hdr->tpdu_AKcdt;
+ e.TPDU_ATTR(AK).e_seq = hdr->tpdu_AKseq;
}
- IFTRACE(D_TPINPUT)
- tptrace(TPPTmisc, "AK recvd seq cdt subseq fcc_pres",
- e.ATTR(AK_TPDU).e_seq, e.ATTR(AK_TPDU).e_cdt,
+#ifdef TPPT
+ if (tp_traceflags[D_TPINPUT]) {
+ tptrace(TPPTmisc, "AK recvd seq cdt subseq fcc_pres",
+ e.TPDU_ATTR(AK).e_seq, e.TPDU_ATTR(AK).e_cdt,
subseq, fcc_present);
- ENDTRACE
+ }
+#endif
- e.ev_number = AK_TPDU;
+ e.ev_number = AK_TPDU;
IncStat(ts_AK_rcvd);
IncPStat(tpcb, tps_AK_rcvd);
break;
- case XAK_TPDU_type:
+ case XAK_TPDU_type:
if (tpcb->tp_xtd_format) {
#ifdef BYTE_ORDER
- union seq_type seqeotX;
+ union seq_type seqeotX;
seqeotX.s_seqeot = ntohl(hdr->tpdu_seqeotX);
- e.ATTR(XAK_TPDU).e_seq = seqeotX.s_seq;
+ e.TPDU_ATTR(XAK).e_seq = seqeotX.s_seq;
#else
- e.ATTR(XAK_TPDU).e_seq = hdr->tpdu_XAKseqX;
-#endif /* BYTE_ORDER */
+ e.TPDU_ATTR(XAK).e_seq = hdr->tpdu_XAKseqX;
+#endif /* BYTE_ORDER */
} else {
- e.ATTR(XAK_TPDU).e_seq = hdr->tpdu_XAKseq;
+ e.TPDU_ATTR(XAK).e_seq = hdr->tpdu_XAKseq;
}
e.ev_number = XAK_TPDU;
IncStat(ts_XAK_rcvd);
IncPStat(tpcb, tps_XAK_rcvd);
break;
- case XPD_TPDU_type:
+ case XPD_TPDU_type:
if (tpcb->tp_xtd_format) {
#ifdef BYTE_ORDER
- union seq_type seqeotX;
+ union seq_type seqeotX;
seqeotX.s_seqeot = ntohl(hdr->tpdu_seqeotX);
- e.ATTR(XPD_TPDU).e_seq = seqeotX.s_seq;
+ e.TPDU_ATTR(XPD).e_seq = seqeotX.s_seq;
#else
- e.ATTR(XPD_TPDU).e_seq = hdr->tpdu_XPDseqX;
-#endif /* BYTE_ORDER */
+ e.TPDU_ATTR(XPD).e_seq = hdr->tpdu_XPDseqX;
+#endif /* BYTE_ORDER */
} else {
- e.ATTR(XPD_TPDU).e_seq = hdr->tpdu_XPDseq;
+ e.TPDU_ATTR(XPD).e_seq = hdr->tpdu_XPDseq;
}
takes_data = TRUE;
e.ev_number = XPD_TPDU;
break;
case DT_TPDU_type:
- { /* the y option will cause occasional packets to be dropped.
- * A little crude but it works.
- */
-
- IFDEBUG(D_DROP)
- if(time.tv_usec & 0x4 && hdr->tpdu_DTseq & 0x1) {
- IncStat(ts_ydebug);
- goto discard;
- }
- ENDDEBUG
+ /*
+ * the y option will cause occasional packets
+ * to be dropped. A little crude but it
+ * works.
+ */
+
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_DROP]) {
+ if (time.tv_usec & 0x4 &&
+ hdr->tpdu_DTseq & 0x1) {
+ IncStat(ts_ydebug);
+ goto discard;
+ }
}
+#endif
if (tpcb->tp_class == TP_CLASS_0) {
- tp0_data:
- e.ATTR(DT_TPDU).e_seq = 0; /* actually don't care */
- e.ATTR(DT_TPDU).e_eot = (((struct tp0du *)hdr)->tp0du_eot);
+#ifdef TPCONS
+ tp0_data:
+#endif
+ e.TPDU_ATTR(DT).e_seq = 0; /* actually don't care */
+ e.TPDU_ATTR(DT).e_eot = (((struct tp0du *) hdr)->tp0du_eot);
} else if (tpcb->tp_xtd_format) {
#ifdef BYTE_ORDER
- union seq_type seqeotX;
+ union seq_type seqeotX;
seqeotX.s_seqeot = ntohl(hdr->tpdu_seqeotX);
- e.ATTR(DT_TPDU).e_seq = seqeotX.s_seq;
- e.ATTR(DT_TPDU).e_eot = seqeotX.s_eot;
+ e.TPDU_ATTR(DT).e_seq = seqeotX.s_seq;
+ e.TPDU_ATTR(DT).e_eot = seqeotX.s_eot;
#else
- e.ATTR(DT_TPDU).e_seq = hdr->tpdu_DTseqX;
- e.ATTR(DT_TPDU).e_eot = hdr->tpdu_DTeotX;
-#endif /* BYTE_ORDER */
+ e.TPDU_ATTR(DT).e_seq = hdr->tpdu_DTseqX;
+ e.TPDU_ATTR(DT).e_eot = hdr->tpdu_DTeotX;
+#endif /* BYTE_ORDER */
} else {
- e.ATTR(DT_TPDU).e_seq = hdr->tpdu_DTseq;
- e.ATTR(DT_TPDU).e_eot = hdr->tpdu_DTeot;
+ e.TPDU_ATTR(DT).e_seq = hdr->tpdu_DTseq;
+ e.TPDU_ATTR(DT).e_eot = hdr->tpdu_DTeot;
}
- if(e.ATTR(DT_TPDU).e_eot)
+ if (e.TPDU_ATTR(DT).e_eot)
IncStat(ts_eot_input);
takes_data = TRUE;
e.ev_number = DT_TPDU;
IncPStat(tpcb, tps_DT_rcvd);
break;
- case GR_TPDU_type:
+ case GR_TPDU_type:
tp_indicate(T_DISCONNECT, tpcb, ECONNABORTED);
/* drop through */
default:
- /* this should NEVER happen because there is a
- * check for dutype well above here
+ /*
+ * this should NEVER happen because there is a check
+ * for dutype well above here
*/
- error = E_TP_INV_TPDU; /* causes an ER */
- IFDEBUG(D_TPINPUT)
+ error = E_TP_INV_TPDU; /* causes an ER */
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
printf("INVALID dutype 0x%x\n", hdr->tpdu_type);
- ENDDEBUG
+ }
+#endif
IncStat(ts_inv_dutype);
goto respond;
}
}
- /* peel off the tp header;
- * remember that the du_li doesn't count itself.
- * This may leave us w/ an empty mbuf at the front of a chain.
- * We can't just throw away the empty mbuf because hdr still points
- * into the mbuf's data area and we're still using hdr (the tpdu header)
+ /*
+ * peel off the tp header; remember that the du_li doesn't count
+ * itself. This may leave us w/ an empty mbuf at the front of a
+ * chain. We can't just throw away the empty mbuf because hdr still
+ * points into the mbuf's data area and we're still using hdr (the
+ * tpdu header)
*/
- m->m_len -= ((int)hdr->tpdu_li + 1);
- m->m_data += ((int)hdr->tpdu_li + 1);
+ m->m_len -= ((int) hdr->tpdu_li + 1);
+ m->m_data += ((int) hdr->tpdu_li + 1);
if (takes_data) {
- int max = tpdu_info[ hdr->tpdu_type ] [TP_MAX_DATA_INDEX];
- int datalen = tpdu_len - hdr->tpdu_li - 1, mbtype = MT_DATA;
+ int max = tpdu_info[hdr->tpdu_type][TP_MAX_DATA_INDEX];
+ int datalen = tpdu_len - hdr->tpdu_li - 1, mbtype = MT_DATA;
struct {
struct tp_disc_reason dr;
- struct cmsghdr x_hdr;
- } x;
+ struct cmsghdr x_hdr;
+ } x;
#define c_hdr x.x_hdr
register struct mbuf *n;
- CHECK( (max && datalen > max), E_TP_LENGTH_INVAL,
- ts_inv_length, respond, (max + hdr->tpdu_li + 1) );
- switch( hdr->tpdu_type ) {
+ CHECK((max && datalen > max), E_TP_LENGTH_INVAL,
+ ts_inv_length, respond, (max + hdr->tpdu_li + 1));
+ switch (hdr->tpdu_type) {
case CR_TPDU_type:
c_hdr.cmsg_type = TPOPT_CONN_DATA;
x.dr.dr_hdr.cmsg_level = SOL_TRANSPORT;
x.dr.dr_reason = hdr->tpdu_DRreason;
c_hdr.cmsg_type = TPOPT_DISC_DATA;
- make_control_msg:
+ make_control_msg:
datalen += sizeof(c_hdr);
c_hdr.cmsg_len = datalen;
c_hdr.cmsg_level = SOL_TRANSPORT;
mbtype = MT_CONTROL;
MGET(n, M_DONTWAIT, MT_DATA);
- if (n == 0)
- {m_freem(m); m = 0; datalen = 0; goto invoke; }
+ if (n == 0) {
+ m_freem(m);
+ m = 0;
+ datalen = 0;
+ goto invoke;
+ }
if (hdr->tpdu_type == DR_TPDU_type) {
datalen += sizeof(x) - sizeof(c_hdr);
- bcopy((caddr_t)&x, mtod(n, caddr_t), n->m_len = sizeof(x));
+ bcopy((caddr_t) & x, mtod(n, caddr_t), n->m_len = sizeof(x));
} else
- bcopy((caddr_t)&c_hdr, mtod(n, caddr_t),
- n->m_len = sizeof(c_hdr));
+ bcopy((caddr_t) & c_hdr, mtod(n, caddr_t),
+ n->m_len = sizeof(c_hdr));
n->m_next = m;
m = n;
/* FALLTHROUGH */
/* FALLTHROUGH */
case DT_TPDU_type:
- for (n = m; n; n = n->m_next) {
+ for (n = m; n; n = n->m_next) {
MCHTYPE(n, mbtype);
}
- invoke:
- e.ATTR(DT_TPDU).e_datalen = datalen;
- e.ATTR(DT_TPDU).e_data = m;
+ invoke:
+ e.TPDU_ATTR(DT).e_datalen = datalen;
+ e.TPDU_ATTR(DT).e_data = m;
break;
default:
printf(
- "ERROR in tp_input! hdr->tpdu_type 0x%x takes_data 0x%x m 0x%x\n",
- hdr->tpdu_type, takes_data, m);
+ "ERROR in tp_input! hdr->tpdu_type 0x%x takes_data 0x%x m 0x%x\n",
+ hdr->tpdu_type, takes_data, m);
break;
}
- /* prevent m_freem() after tp_driver() from throwing it all away */
+ /*
+ * prevent m_freem() after tp_driver() from throwing it all
+ * away
+ */
m = MNULL;
}
-
IncStat(ts_tpdu_rcvd);
- IFDEBUG(D_TPINPUT)
- printf( "tp_input: before driver, state 0x%x event 0x%x m 0x%x",
- tpcb->tp_state, e.ev_number, m );
- printf(" e.e_data 0x%x\n", e.ATTR(DT_TPDU).e_data);
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
+ printf("tp_input: before driver, state 0x%x event 0x%x m 0x%x",
+ tpcb->tp_state, e.ev_number, m);
+ printf(" e.e_data 0x%x\n", e.TPDU_ATTR(DT).e_data);
printf("takes_data 0x%x m_len 0x%x, tpdu_len 0x%x\n",
- takes_data, (m==MNULL)?0:m->m_len, tpdu_len);
- ENDDEBUG
+ takes_data, (m == MNULL) ? 0 : m->m_len, tpdu_len);
+ }
+#endif
error = tp_driver(tpcb, &e);
- ASSERT(tpcb != (struct tp_pcb *)0);
- ASSERT(tpcb->tp_sock != (struct socket *)0);
- if( tpcb->tp_sock->so_error == 0 )
+ ASSERT(tpcb != (struct tp_pcb *) 0);
+ ASSERT(tpcb->tp_sock != (struct socket *) 0);
+ if (tpcb->tp_sock->so_error == 0)
tpcb->tp_sock->so_error = error;
- /* Kludge to keep the state tables under control (adding
- * data on connect & disconnect & freeing the mbuf containing
- * the data would have exploded the tables and made a big mess ).
+ /*
+ * Kludge to keep the state tables under control (adding data on
+ * connect & disconnect & freeing the mbuf containing the data would
+ * have exploded the tables and made a big mess ).
*/
- switch(e.ev_number) {
- case CC_TPDU:
- case DR_TPDU:
- case CR_TPDU:
- m = e.ATTR(CC_TPDU).e_data; /* same field for all three dutypes */
- IFDEBUG(D_TPINPUT)
- printf("after driver, restoring m to 0x%x, takes_data 0x%x\n",
- m, takes_data);
- ENDDEBUG
- break;
- default:
- break;
+ switch (e.ev_number) {
+ case CC_TPDU:
+ case DR_TPDU:
+ case CR_TPDU:
+ m = e.TPDU_ATTR(CC).e_data; /* same field for all three
+ * dutypes */
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
+ printf("after driver, restoring m to 0x%x, takes_data 0x%x\n",
+ m, takes_data);
+ }
+#endif
+ break;
+ default:
+ break;
}
- /* Concatenated sequences are terminated by any tpdu that
- * carries data: CR, CC, DT, XPD, DR.
- * All other tpdu types may be concatenated: AK, XAK, DC, ER.
+ /*
+ * Concatenated sequences are terminated by any tpdu that carries
+ * data: CR, CC, DT, XPD, DR. All other tpdu types may be
+ * concatenated: AK, XAK, DC, ER.
*/
-separate:
- if ( takes_data == 0 ) {
- ASSERT( m != MNULL );
- /*
- * we already peeled off the prev. tp header so
- * we can just pull up some more and repeat
+ if (takes_data == 0) {
+ ASSERT(m != MNULL);
+ /*
+ * we already peeled off the prev. tp header so we can just
+ * pull up some more and repeat
*/
- if( m = tp_inputprep(m) ) {
- IFDEBUG(D_TPINPUT)
- hdr = mtod(m, struct tpdu *);
- printf("tp_input @ separate: hdr 0x%x size %d m 0x%x\n",
- hdr, (int) hdr->tpdu_li + 1, m);
- dump_mbuf(m, "tp_input after driver, at separate");
- ENDDEBUG
+ if ((m = tp_inputprep(m)) != NULL) {
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
+ hdr = mtod(m, struct tpdu *);
+ printf("tp_input @ separate: hdr 0x%x size %d m 0x%x\n",
+ hdr, (int) hdr->tpdu_li + 1, m);
+ dump_mbuf(m, "tp_input after driver, at separate");
+ }
+#endif
IncStat(ts_concat_rcvd);
goto again;
}
}
- if ( m != MNULL ) {
- IFDEBUG(D_TPINPUT)
+ if (m != MNULL) {
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
printf("tp_input : m_freem(0x%x)\n", m);
- ENDDEBUG
+ }
+#endif
m_freem(m);
- IFDEBUG(D_TPINPUT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
printf("tp_input : after m_freem 0x%x\n", m);
- ENDDEBUG
+ }
+#endif
}
return;
discard:
/* class 4: drop the tpdu */
- /* class 2,0: Should drop the net connection, if you can figure out
+ /*
+ * class 2,0: Should drop the net connection, if you can figure out
* to which connection it applies
*/
- IFDEBUG(D_TPINPUT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
printf("tp_input DISCARD\n");
- ENDDEBUG
- IFTRACE(D_TPINPUT)
- tptrace(TPPTmisc, "tp_input DISCARD m", m,0,0,0);
- ENDTRACE
- m_freem(m);
+ }
+#endif
+#ifdef TPPT
+ if (tp_traceflags[D_TPINPUT]) {
+ tptrace(TPPTmisc, "tp_input DISCARD m", m, 0, 0, 0);
+ }
+#endif
+ m_freem(m);
IncStat(ts_recv_drop);
return;
error |= TP_ERROR_SNDC;
}
respond:
- IFDEBUG(D_TPINPUT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
printf("RESPOND: error 0x%x, errlen 0x%x\n", error, errlen);
- ENDDEBUG
- IFTRACE(D_TPINPUT)
+ }
+#endif
+#ifdef TPPT
+ if (tp_traceflags[D_TPINPUT]) {
tptrace(TPPTmisc, "tp_input RESPOND m error sref", m, error, sref, 0);
- ENDTRACE
- if (sref == 0)
+ }
+#endif
+ if (sref == 0)
goto discard;
- (void) tp_error_emit(error, (u_long)sref, satosiso(faddr),
- satosiso(laddr), m, errlen, tpcb,
- cons_channel, dgout_routine);
- IFDEBUG(D_ERROR_EMIT)
+ (void) tp_error_emit(error, (u_long) sref, satosiso(faddr),
+ satosiso(laddr), m, errlen, tpcb,
+ cons_channel, dgout_routine);
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ERROR_EMIT]) {
printf("tp_input after error_emit\n");
- ENDDEBUG
+ }
+#endif
#ifdef lint
- printf("",sref,opt);
-#endif /* lint */
+ printf("", sref, opt);
+#endif /* lint */
IncStat(ts_recv_drop);
}
* much data to put in each tpdu.
*
* FUNCTION, ARGUMENTS, and RETURN VALUE:
- * For a given connection, represented by (tpcb), and
+ * For a given connection, represented by (tpcb), and
* tpdu type (dutype), return the size of a tp header.
*
* RETURNS: the expected size of the heade in bytesr
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
* NOTES: It would be nice if it got the network header size as well.
*/
int
-tp_headersize(dutype, tpcb)
- int dutype;
- struct tp_pcb *tpcb;
+tp_headersize(dutype, tpcb)
+ int dutype;
+ struct tp_pcb *tpcb;
{
- register int size = 0;
+ register int size = 0;
- IFTRACE(D_CONN)
+#ifdef TPPT
+ if (tp_traceflags[D_CONN]) {
tptrace(TPPTmisc, "tp_headersize dutype class xtd_format",
dutype, tpcb->tp_class, tpcb->tp_xtd_format, 0);
- ENDTRACE
- if( !( (tpcb->tp_class == TP_CLASS_0) ||
- (tpcb->tp_class == TP_CLASS_4) ||
- (dutype == DR_TPDU_type) ||
- (dutype == CR_TPDU_type) )) {
- printf("tp_headersize:dutype 0x%x, class 0x%x",
- dutype, tpcb->tp_class);
- /* TODO: identify this and GET RID OF IT */
}
- ASSERT( (tpcb->tp_class == TP_CLASS_0) ||
- (tpcb->tp_class == TP_CLASS_4) ||
- (dutype == DR_TPDU_type) ||
- (dutype == CR_TPDU_type) );
-
- if( tpcb->tp_class == TP_CLASS_0 ) {
- size = tpdu_info[ dutype ] [TP_LEN_CLASS_0_INDEX];
- } else {
- size = tpdu_info[ dutype ] [tpcb->tp_xtd_format];
- }
+#endif
+ if (!((tpcb->tp_class == TP_CLASS_0) ||
+ (tpcb->tp_class == TP_CLASS_4) ||
+ (dutype == DR_TPDU_type) ||
+ (dutype == CR_TPDU_type))) {
+ printf("tp_headersize:dutype 0x%x, class 0x%x",
+ dutype, tpcb->tp_class);
+ /* TODO: identify this and GET RID OF IT */
+ }
+ ASSERT((tpcb->tp_class == TP_CLASS_0) ||
+ (tpcb->tp_class == TP_CLASS_4) ||
+ (dutype == DR_TPDU_type) ||
+ (dutype == CR_TPDU_type));
+
+ if (tpcb->tp_class == TP_CLASS_0) {
+ size = tpdu_info[dutype][TP_LEN_CLASS_0_INDEX];
+ } else {
+ size = tpdu_info[dutype][tpcb->tp_xtd_format];
+ }
return size;
/* caller must get network level header size separately */
}
-/* $NetBSD: tp_ip.h,v 1.6 1995/06/13 07:58:19 mycroft Exp $ */
+/* $OpenBSD: tp_ip.h,v 1.2 1996/03/04 10:36:05 mickey Exp $ */
+/* $NetBSD: tp_ip.h,v 1.7 1996/02/13 22:11:12 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
/*
* ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison
*/
-/*
+/*
* internet IP-dependent structures and include files
*/
struct inpcbtable tp_inpcb;
- /* queue of active inpcbs for tp ; for tp with dod ip */
+/* queue of active inpcbs for tp ; for tp with dod ip */
-#endif /* _NETISO_TP_IP_H_ */
+#endif /* _NETISO_TP_IP_H_ */
-/* $NetBSD: tp_iso.c,v 1.6 1994/09/20 06:41:35 cgd Exp $ */
+/* $OpenBSD: tp_iso.c,v 1.2 1996/03/04 10:36:07 mickey Exp $ */
+/* $NetBSD: tp_iso.c,v 1.7 1996/02/13 22:11:15 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
/*
* ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison
*/
-/*
- * Here is where you find the iso-dependent code. We've tried
- * keep all net-level and (primarily) address-family-dependent stuff
- * out of the tp source, and everthing here is reached indirectly
- * through a switch table (struct nl_protosw *) tpcb->tp_nlproto
- * (see tp_pcb.c).
- * The routines here are:
- * iso_getsufx: gets transport suffix out of an isopcb structure.
- * iso_putsufx: put transport suffix into an isopcb structure.
- * iso_putnetaddr: put a whole net addr into an isopcb.
- * iso_getnetaddr: get a whole net addr from an isopcb.
- * iso_cmpnetaddr: compare a whole net addr from an isopcb.
- * iso_recycle_suffix: clear suffix for reuse in isopcb
- * tpclnp_ctlinput: handle ER CNLPdu : icmp-like stuff
- * tpclnp_mtu: figure out what size tpdu to use
- * tpclnp_input: take a pkt from clnp, strip off its clnp header,
- * give to tp
- * tpclnp_output_dg: package a pkt for clnp given 2 addresses & some data
- * tpclnp_output: package a pkt for clnp given an isopcb & some data
+/*
+ * Here is where you find the iso-dependent code. We've tried keep all
+ * net-level and (primarily) address-family-dependent stuff out of the tp
+ * source, and everthing here is reached indirectly through a switch table
+ * (struct nl_protosw *) tpcb->tp_nlproto (see tp_pcb.c). The routines here
+ * are: iso_getsufx: gets transport suffix out of an isopcb structure.
+ * iso_putsufx: put transport suffix into an isopcb structure.
+ * iso_putnetaddr: put a whole net addr into an isopcb. iso_getnetaddr: get a
+ * whole net addr from an isopcb. iso_cmpnetaddr: compare a whole net addr
+ * from an isopcb. iso_recycle_suffix: clear suffix for reuse in isopcb
+ * tpclnp_ctlinput: handle ER CNLPdu : icmp-like stuff tpclnp_mtu: figure out
+ * what size tpdu to use tpclnp_input: take a pkt from clnp, strip off its
+ * clnp header, give to tp tpclnp_output_dg: package a pkt for clnp given 2
+ * addresses & some data tpclnp_output: package a pkt for clnp given an
+ * isopcb & some data
*/
#ifdef ISO
#include <sys/errno.h>
#include <sys/time.h>
#include <sys/protosw.h>
+#include <sys/systm.h>
#include <sys/kernel.h>
#include <net/if.h>
#include <netiso/tp_stat.h>
#include <netiso/tp_tpdu.h>
#include <netiso/tp_clnp.h>
+#include <netiso/tp_var.h>
#include <netiso/cltp_var.h>
+#include <netiso/idrp_var.h>
+
+#ifdef TUBA
+#include <netiso/tuba_table.h>
+#endif
-void tpclnp_ctlinput();
+#include <machine/stdarg.h>
/*
* CALLED FROM:
* The argument (which) takes the value TP_LOCAL or TP_FOREIGN.
*/
-iso_getsufx(isop, lenp, data_out, which)
- struct isopcb *isop;
- u_short *lenp;
- caddr_t data_out;
- int which;
+void
+iso_getsufx(v, lenp, data_out, which)
+ void *v;
+ u_short *lenp;
+ caddr_t data_out;
+ int which;
{
+ struct isopcb *isop = v;
register struct sockaddr_iso *addr = 0;
switch (which) {
bcopy(TSEL(addr), data_out, (*lenp = addr->siso_tlen));
}
-/* CALLED FROM:
- * tp_newsocket(); i.e., when a connection is being established by an
- * incoming CR_TPDU.
+/*
+ * CALLED FROM: tp_newsocket(); i.e., when a connection is being established
+ * by an incoming CR_TPDU.
*
- * FUNCTION, ARGUMENTS:
- * Put a transport suffix (found in name) into an isopcb structure (isop).
- * The argument (which) takes the value TP_LOCAL or TP_FOREIGN.
+ * FUNCTION, ARGUMENTS: Put a transport suffix (found in name) into an isopcb
+ * structure (isop). The argument (which) takes the value TP_LOCAL or
+ * TP_FOREIGN.
*/
void
-iso_putsufx(isop, sufxloc, sufxlen, which)
- struct isopcb *isop;
- caddr_t sufxloc;
- int sufxlen, which;
+iso_putsufx(v, sufxloc, sufxlen, which)
+ void *v;
+ caddr_t sufxloc;
+ int sufxlen, which;
{
+ struct isopcb *isop = v;
struct sockaddr_iso **dst, *backup;
register struct sockaddr_iso *addr;
- struct mbuf *m;
- int len;
+ struct mbuf *m;
+ int len;
switch (which) {
default:
printf("iso_putsufx on un-initialized isopcb\n");
}
len = sufxlen + addr->siso_nlen +
- (sizeof(*addr) - sizeof(addr->siso_data));
+ (sizeof(*addr) - sizeof(addr->siso_data));
if (addr == backup) {
if (len > sizeof(*addr)) {
- m = m_getclr(M_DONTWAIT, MT_SONAME);
- if (m == 0)
- return;
- addr = *dst = mtod(m, struct sockaddr_iso *);
- *addr = *backup;
- m->m_len = len;
+ m = m_getclr(M_DONTWAIT, MT_SONAME);
+ if (m == 0)
+ return;
+ addr = *dst = mtod(m, struct sockaddr_iso *);
+ *addr = *backup;
+ m->m_len = len;
}
}
bcopy(sufxloc, TSEL(addr), sufxlen);
* CALLED FROM:
* tp.trans whenever we go into REFWAIT state.
* FUNCTION and ARGUMENT:
- * Called when a ref is frozen, to allow the suffix to be reused.
+ * Called when a ref is frozen, to allow the suffix to be reused.
* (isop) is the net level pcb. This really shouldn't have to be
* done in a NET level pcb but... for the internet world that just
* the way it is done in BSD...
* timer goes off.
*/
void
-iso_recycle_tsuffix(isop)
- struct isopcb *isop;
+iso_recycle_tsuffix(v)
+ void *v;
{
+ struct isopcb *isop = v;
isop->isop_laddr->siso_tlen = isop->isop_faddr->siso_tlen = 0;
}
* Copy a whole net addr from a struct sockaddr (name).
* into an isopcb (isop).
* The argument (which) takes values TP_LOCAL or TP_FOREIGN
- */
+ */
void
-iso_putnetaddr(isop, name, which)
- register struct isopcb *isop;
- struct sockaddr_iso *name;
- int which;
+iso_putnetaddr(v, nm, which)
+ register void *v;
+ struct sockaddr *nm;
+ int which;
{
+ register struct isopcb *isop = v;
+ struct sockaddr_iso *name = (struct sockaddr_iso *) nm;
struct sockaddr_iso **sisop, *backup;
register struct sockaddr_iso *siso;
backup = &isop->isop_sfaddr;
}
siso = ((*sisop == 0) ? (*sisop = backup) : *sisop);
- IFDEBUG(D_TPISO)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPISO]) {
printf("ISO_PUTNETADDR\n");
dump_isoaddr(isop->isop_faddr);
- ENDDEBUG
+ }
+#endif
siso->siso_addr = name->siso_addr;
}
* compare a whole net addr from a struct sockaddr (name),
* with that implicitly stored in an isopcb (isop).
* The argument (which) takes values TP_LOCAL or TP_FOREIGN.
- */
-iso_cmpnetaddr(isop, name, which)
- register struct isopcb *isop;
- register struct sockaddr_iso *name;
- int which;
+ */
+int
+iso_cmpnetaddr(v, nm, which)
+ register void *v;
+ struct sockaddr *nm;
+ int which;
{
+ register struct isopcb *isop = v;
+ struct sockaddr_iso *name = (struct sockaddr_iso *) nm;
struct sockaddr_iso **sisop, *backup;
register struct sockaddr_iso *siso;
backup = &isop->isop_sfaddr;
}
siso = ((*sisop == 0) ? (*sisop = backup) : *sisop);
- IFDEBUG(D_TPISO)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPISO]) {
printf("ISO_CMPNETADDR\n");
dump_isoaddr(siso);
- ENDDEBUG
+ }
+#endif
if (name->siso_tlen && bcmp(TSEL(name), TSEL(siso), name->siso_tlen))
return (0);
- return (bcmp((caddr_t)name->siso_data,
- (caddr_t)siso->siso_data, name->siso_nlen) == 0);
+ return (bcmp((caddr_t) name->siso_data,
+ (caddr_t) siso->siso_data, name->siso_nlen) == 0);
}
/*
* Copy a whole net addr from an isopcb (isop) into
* a struct sockaddr (name).
* The argument (which) takes values TP_LOCAL or TP_FOREIGN.
- */
+ */
void
-iso_getnetaddr( isop, name, which)
- struct isopcb *isop;
- struct mbuf *name;
- int which;
+iso_getnetaddr(v, name, which)
+ register void *v;
+ struct mbuf *name;
+ int which;
{
+ register struct inpcb *inp = v;
+ register struct isopcb *isop = (struct isopcb *) inp;
struct sockaddr_iso *siso =
- (which == TP_LOCAL ? isop->isop_laddr : isop->isop_faddr);
+ (which == TP_LOCAL ? isop->isop_laddr : isop->isop_faddr);
if (siso)
- bcopy((caddr_t)siso, mtod(name, caddr_t),
- (unsigned)(name->m_len = siso->siso_len));
+ bcopy((caddr_t) siso, mtod(name, caddr_t),
+ (unsigned) (name->m_len = siso->siso_len));
else
name->m_len = 0;
}
* It appears that setting a double pointer to the rtentry associated with
* the destination, and returning the header size for the network protocol
* suffices.
- *
+ *
* SIDE EFFECTS:
* Sets tp_routep pointer in pcb.
*
* NOTES:
*/
-tpclnp_mtu(tpcb)
-register struct tp_pcb *tpcb;
+int
+tpclnp_mtu(v)
+ void *v;
{
- struct isopcb *isop = (struct isopcb *)tpcb->tp_npcb;
+ register struct tp_pcb *tpcb = v;
+ struct isopcb *isop = (struct isopcb *) tpcb->tp_npcb;
- IFDEBUG(D_CONN)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
printf("tpclnp_mtu(tpcb)\n", tpcb);
- ENDDEBUG
+ }
+#endif
tpcb->tp_routep = &(isop->isop_route.ro_rt);
if (tpcb->tp_netservice == ISO_CONS)
return 0;
*/
int
-tpclnp_output(isop, m0, datalen, nochksum)
- struct isopcb *isop;
- struct mbuf *m0;
- int datalen;
- int nochksum;
+#if __STDC__
+tpclnp_output(struct mbuf *m0, ...)
+#else
+tpclnp_output(m0, va_alist)
+ struct mbuf *m0;
+ va_dcl
+#endif
{
- register struct mbuf *m = m0;
+ int datalen;
+ struct isopcb *isop;
+ int nochksum;
+ va_list ap;
+
+ va_start(ap, m0);
+ datalen = va_arg(ap, int);
+ isop = va_arg(ap, struct isopcb *);
+ nochksum = va_arg(ap, int);
+ va_end(ap);
+
IncStat(ts_tpdu_sent);
- IFDEBUG(D_TPISO)
- struct tpdu *hdr = mtod(m0, struct tpdu *);
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPISO]) {
+ struct tpdu *hdr = mtod(m0, struct tpdu *);
printf(
-"abt to call clnp_output: datalen 0x%x, hdr.li 0x%x, hdr.dutype 0x%x nocsum x%x dst addr:\n",
- datalen,
- (int)hdr->tpdu_li, (int)hdr->tpdu_type, nochksum);
+ "abt to call clnp_output: datalen 0x%x, hdr.li 0x%x, hdr.dutype 0x%x nocsum x%x dst addr:\n",
+ datalen,
+ (int) hdr->tpdu_li, (int) hdr->tpdu_type, nochksum);
dump_isoaddr(isop->isop_faddr);
printf("\nsrc addr:\n");
dump_isoaddr(isop->isop_laddr);
dump_mbuf(m0, "at tpclnp_output");
- ENDDEBUG
+ }
+#endif
- return
- clnp_output(m0, isop, datalen, /* flags */nochksum ? CLNP_NO_CKSUM : 0);
+ return
+ clnp_output(m0, isop, datalen, /* flags */ nochksum ? CLNP_NO_CKSUM : 0);
}
/*
*/
int
-tpclnp_output_dg(laddr, faddr, m0, datalen, ro, nochksum)
- struct iso_addr *laddr, *faddr;
- struct mbuf *m0;
- int datalen;
- struct route *ro;
- int nochksum;
+#if __STDC__
+tpclnp_output_dg(struct mbuf *m0, ...)
+#else
+tpclnp_output_dg(m0, va_alist)
+ struct mbuf *m0;
+ va_dcl
+#endif
{
- struct isopcb tmppcb;
- int err;
- int flags;
- register struct mbuf *m = m0;
-
- IFDEBUG(D_TPISO)
+ struct isopcb tmppcb;
+ int err;
+ int flags;
+ int datalen;
+ struct iso_addr *laddr, *faddr;
+ struct route *ro;
+ int nochksum;
+ va_list ap;
+
+ va_start(ap, m0);
+ datalen = va_arg(ap, int);
+ laddr = va_arg(ap, struct iso_addr *);
+ faddr = va_arg(ap, struct iso_addr *);
+ ro = va_arg(ap, struct route *);
+ nochksum = va_arg(ap, int);
+ va_end(ap);
+
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPISO]) {
printf("tpclnp_output_dg datalen 0x%x m0 0x%x\n", datalen, m0);
- ENDDEBUG
+ }
+#endif
/*
* Fill in minimal portion of isopcb so that clnp can send the
* packet.
*/
- bzero((caddr_t)&tmppcb, sizeof(tmppcb));
+ bzero((caddr_t) & tmppcb, sizeof(tmppcb));
tmppcb.isop_laddr = &tmppcb.isop_sladdr;
tmppcb.isop_laddr->siso_addr = *laddr;
tmppcb.isop_faddr = &tmppcb.isop_sfaddr;
tmppcb.isop_faddr->siso_addr = *faddr;
- IFDEBUG(D_TPISO)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPISO]) {
printf("tpclnp_output_dg faddr: \n");
dump_isoaddr(&tmppcb.isop_sfaddr);
printf("\ntpclnp_output_dg laddr: \n");
dump_isoaddr(&tmppcb.isop_sladdr);
printf("\n");
- ENDDEBUG
+ }
+#endif
/*
* Do not use packet cache since this is a one shot error packet
*/
- flags = (CLNP_NOCACHE|(nochksum?CLNP_NO_CKSUM:0));
+ flags = (CLNP_NOCACHE | (nochksum ? CLNP_NO_CKSUM : 0));
IncStat(ts_tpdu_sent);
- err = clnp_output(m0, &tmppcb, datalen, flags);
-
+ err = clnp_output(m0, &tmppcb, datalen, flags);
+
/*
* Free route allocated by clnp (if the route was indeed allocated)
*/
if (tmppcb.isop_route.ro_rt)
RTFREE(tmppcb.isop_route.ro_rt);
-
- return(err);
+
+ return (err);
}
/*
* CALLED FROM:
* clnp's input routine, indirectly through the protosw.
* FUNCTION and ARGUMENTS:
* Take a packet (m) from clnp, strip off the clnp header and give it to tp
- * No return value.
+ * No return value.
*/
void
-tpclnp_input(m, src, dst, clnp_len, ce_bit)
- register struct mbuf *m;
- struct sockaddr_iso *src, *dst;
- int clnp_len, ce_bit;
+#if __STDC__
+tpclnp_input(struct mbuf *m, ...)
+#else
+tpclnp_input(m, va_alist)
+ struct mbuf *m;
+ va_dcl
+#endif
{
- struct mbuf *tp_inputprep();
- void tp_input(), cltp_input(), (*input)() = tp_input;
+ struct sockaddr_iso *src, *dst;
+ int clnp_len, ce_bit;
+ void (*input) __P((struct mbuf *, ...)) = tp_input;
+ va_list ap;
+
+ va_start(ap, m);
+ src = va_arg(ap, struct sockaddr_iso *);
+ dst = va_arg(ap, struct sockaddr_iso *);
+ clnp_len = va_arg(ap, int);
+ ce_bit = va_arg(ap, int);
+ va_end(ap);
IncStat(ts_pkt_rcvd);
- IFDEBUG(D_TPINPUT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
printf("tpclnp_input: m 0x%x clnp_len 0x%x\n", m, clnp_len);
dump_mbuf(m, "at tpclnp_input");
- ENDDEBUG
+ }
+#endif
/*
* CLNP gives us an mbuf chain WITH the clnp header pulled up,
* and the length of the clnp header.
if (mtod(m, u_char *)[1] == UD_TPDU_type)
input = cltp_input;
- IFDEBUG(D_TPINPUT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
dump_mbuf(m, "after tpclnp_input both pullups");
- ENDDEBUG
+ }
+#endif
- IFDEBUG(D_TPISO)
- printf("calling %sinput : src 0x%x, dst 0x%x, src addr:\n",
- (input == tp_input ? "tp_" : "clts_"), src, dst);
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPISO]) {
+ printf("calling %sinput : src 0x%x, dst 0x%x, src addr:\n",
+ (input == tp_input ? "tp_" : "clts_"), src, dst);
dump_isoaddr(src);
printf(" dst addr:\n");
dump_isoaddr(dst);
- ENDDEBUG
+ }
+#endif
- (*input)(m, (struct sockaddr *)src, (struct sockaddr *)dst, 0,
- tpclnp_output_dg, ce_bit);
+ (*input) (m, (struct sockaddr *) src, (struct sockaddr *) dst, 0,
+ tpclnp_output_dg, ce_bit);
- IFDEBUG(D_QUENCH)
- {
- if(time.tv_usec & 0x4 && time.tv_usec & 0x40) {
- printf("tpclnp_input: FAKING %s\n",
- tp_stat.ts_pkt_rcvd & 0x1?"QUENCH":"QUENCH2");
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_QUENCH]) {{
+ if (time.tv_usec & 0x4 && time.tv_usec & 0x40) {
+ printf("tpclnp_input: FAKING %s\n",
+ tp_stat.ts_pkt_rcvd & 0x1 ? "QUENCH" : "QUENCH2");
if (tp_stat.ts_pkt_rcvd & 0x1)
- tpclnp_ctlinput(PRC_QUENCH, &src);
+ tpclnp_ctlinput(PRC_QUENCH,
+ (struct sockaddr *)
+ &src, NULL);
else
- tpclnp_ctlinput(PRC_QUENCH2, &src);
+ tpclnp_ctlinput(PRC_QUENCH2,
+ (struct sockaddr *)
+ &src, NULL);
}
- }
- ENDDEBUG
+ }
+ }
+#endif
}
+/*ARGSUSED*/
void
-iso_rtchange()
+iso_rtchange(pcb)
+ struct isopcb *pcb;
{
}
*/
void
tpiso_decbit(isop)
- struct isopcb *isop;
+ struct isopcb *isop;
{
- tp_quench((struct tp_pcb *)isop->isop_socket->so_pcb, PRC_QUENCH2);
+ tp_quench((struct inpcb *) isop->isop_socket->so_pcb, PRC_QUENCH2);
}
/*
* CALLED FROM:
*/
void
tpiso_quench(isop)
- struct isopcb *isop;
+ struct isopcb *isop;
{
- tp_quench((struct tp_pcb *)isop->isop_socket->so_pcb, PRC_QUENCH);
+ tp_quench((struct inpcb *) isop->isop_socket->so_pcb, PRC_QUENCH);
}
/*
* It either returns an error status to the user or
* it causes all connections on this address to be aborted
* by calling the appropriate xx_notify() routine.
- * (cmd) is the type of ICMP error.
+ * (cmd) is the type of ICMP error.
* (siso) is the address of the guy who sent the ER CLNPDU
*/
-void
-tpclnp_ctlinput(cmd, siso)
- int cmd;
- struct sockaddr_iso *siso;
+void *
+tpclnp_ctlinput(cmd, saddr, dummy)
+ int cmd;
+ struct sockaddr *saddr;
+ void *dummy;
{
- extern u_char inetctlerrmap[];
- void tpiso_abort(), iso_rtchange(), tpiso_reset(), iso_pcbnotify();
+ struct sockaddr_iso *siso = (struct sockaddr_iso *) saddr;
+ extern u_char inetctlerrmap[];
- IFDEBUG(D_TPINPUT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
printf("tpclnp_ctlinput1: cmd 0x%x addr: \n", cmd);
dump_isoaddr(siso);
- ENDDEBUG
+ }
+#endif
if (cmd < 0 || cmd > PRC_NCMDS)
- return;
+ return NULL;
if (siso->siso_family != AF_ISO)
- return;
+ return NULL;
switch (cmd) {
- case PRC_QUENCH2:
- iso_pcbnotify(&tp_isopcb, siso, 0, (int (*)())tpiso_decbit);
- break;
+ case PRC_QUENCH2:
+ iso_pcbnotify(&tp_isopcb, siso, 0, tpiso_decbit);
+ break;
- case PRC_QUENCH:
- iso_pcbnotify(&tp_isopcb, siso, 0, (int (*)())tpiso_quench);
- break;
+ case PRC_QUENCH:
+ iso_pcbnotify(&tp_isopcb, siso, 0, tpiso_quench);
+ break;
- case PRC_TIMXCEED_REASS:
- case PRC_ROUTEDEAD:
- iso_pcbnotify(&tp_isopcb, siso, 0, tpiso_reset);
- break;
+ case PRC_TIMXCEED_REASS:
+ case PRC_ROUTEDEAD:
+ iso_pcbnotify(&tp_isopcb, siso, 0, tpiso_reset);
+ break;
- case PRC_HOSTUNREACH:
- case PRC_UNREACH_NET:
- case PRC_IFDOWN:
- case PRC_HOSTDEAD:
- iso_pcbnotify(&tp_isopcb, siso,
- (int)inetctlerrmap[cmd], iso_rtchange);
- break;
+ case PRC_HOSTUNREACH:
+ case PRC_UNREACH_NET:
+ case PRC_IFDOWN:
+ case PRC_HOSTDEAD:
+ iso_pcbnotify(&tp_isopcb, siso,
+ (int) inetctlerrmap[cmd], iso_rtchange);
+ break;
- default:
+ default:
/*
case PRC_MSGSIZE:
case PRC_UNREACH_HOST:
case PRC_TIMXCEED_INTRANS:
case PRC_PARAMPROB:
*/
- iso_pcbnotify(&tp_isopcb, siso, (int)inetctlerrmap[cmd], tpiso_abort);
+ iso_pcbnotify(&tp_isopcb, siso, (int) inetctlerrmap[cmd], tpiso_abort);
break;
}
+ return NULL;
}
/*
* XXX - Variant which is called by clnp_er.c with an isoaddr rather
*/
static struct sockaddr_iso siso = {sizeof(siso), AF_ISO};
+void
tpclnp_ctlinput1(cmd, isoa)
- int cmd;
+ int cmd;
struct iso_addr *isoa;
{
- bzero((caddr_t)&siso.siso_addr, sizeof(siso.siso_addr));
- bcopy((caddr_t)isoa, (caddr_t)&siso.siso_addr, isoa->isoa_len);
- tpclnp_ctlinput(cmd, &siso);
+ bzero((caddr_t) & siso.siso_addr, sizeof(siso.siso_addr));
+ bcopy((caddr_t) isoa, (caddr_t) & siso.siso_addr, isoa->isoa_len);
+ tpclnp_ctlinput(cmd, (struct sockaddr *) &siso, NULL);
}
/*
*/
void
tpiso_abort(isop)
- struct isopcb *isop;
+ struct isopcb *isop;
{
struct tp_event e;
- IFDEBUG(D_CONN)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
printf("tpiso_abort 0x%x\n", isop);
- ENDDEBUG
+ }
+#endif
e.ev_number = ER_TPDU;
- e.ATTR(ER_TPDU).e_reason = ECONNABORTED;
- tp_driver((struct tp_pcb *)isop->isop_socket->so_pcb, &e);
+ e.TPDU_ATTR(ER).e_reason = ECONNABORTED;
+ tp_driver((struct tp_pcb *) isop->isop_socket->so_pcb, &e);
}
void
tpiso_reset(isop)
- struct isopcb *isop;
+ struct isopcb *isop;
{
struct tp_event e;
e.ev_number = T_NETRESET;
- tp_driver((struct tp_pcb *)isop->isop_socket->so_pcb, &e);
+ tp_driver((struct tp_pcb *) isop->isop_socket->so_pcb, &e);
}
-#endif /* ISO */
+#endif /* ISO */
-/* $NetBSD: tp_meas.c,v 1.6 1994/06/29 06:40:19 cgd Exp $ */
+/* $OpenBSD: tp_meas.c,v 1.2 1996/03/04 10:36:09 mickey Exp $ */
+/* $NetBSD: tp_meas.c,v 1.7 1996/02/13 22:11:18 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
extern struct timeval time;
#ifdef TP_PERF_MEAS
-int tp_Measn = 0;
-struct tp_Meas tp_Meas[TPMEASN];
+int tp_Measn = 0;
+struct tp_Meas tp_Meas[TPMEASN];
/*
* NAME: tpmeas()
* stashes a performance-measurement event for the given reference (ref)
* (kind) tells which kind of event, timev is the time to be stored
* with this event, (seq), (win), and (size) are integers that usually
- * refer to the sequence number, window number (on send) and
+ * refer to the sequence number, window number (on send) and
* size of tpdu or window.
*
* RETURNS: Nada
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
*/
void
Tpmeas(ref, kind, timev, seq, win, size)
- u_int ref;
- u_int kind;
- struct timeval *timev;
- u_int seq, win, size;
+ u_int ref;
+ u_int kind;
+ struct timeval *timev;
+ u_int seq, win, size;
{
register struct tp_Meas *tpm;
- static int mseq;
+ static int mseq;
tpm = &tp_Meas[tp_Measn++];
tp_Measn %= TPMEASN;
tpm->tpm_kind = kind;
tpm->tpm_tseq = mseq++;
tpm->tpm_ref = ref;
- if(kind == TPtime_from_ll)
- bcopy((caddr_t)timev, (caddr_t)&tpm->tpm_time, sizeof(struct timeval));
+ if (kind == TPtime_from_ll)
+ bcopy((caddr_t) timev, (caddr_t) & tpm->tpm_time, sizeof(struct timeval));
else
- bcopy( (caddr_t)&time,
- (caddr_t)&tpm->tpm_time, sizeof(struct timeval) );
+ bcopy((caddr_t) & time,
+ (caddr_t) & tpm->tpm_time, sizeof(struct timeval));
tpm->tpm_seq = seq;
tpm->tpm_window = win;
tpm->tpm_size = size;
}
-#endif /* TP_PERF_MEAS */
+#endif /* TP_PERF_MEAS */
-/* $NetBSD: tp_meas.h,v 1.5 1994/06/29 06:40:22 cgd Exp $ */
+/* $OpenBSD: tp_meas.h,v 1.2 1996/03/04 10:36:11 mickey Exp $ */
+/* $NetBSD: tp_meas.h,v 1.6 1996/02/13 22:11:21 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
Tpmeas((u_int)(a), (u_int)(b), t, (u_int)(c), (u_int)(d), (u_int)(e))
struct tp_Meas {
- int tpm_tseq;
- u_char tpm_kind;
- u_short tpm_ref;
- u_short tpm_size;
- u_short tpm_window;
- u_int tpm_seq;
- struct timeval tpm_time;
+ int tpm_tseq;
+ u_char tpm_kind;
+ u_short tpm_ref;
+ u_short tpm_size;
+ u_short tpm_window;
+ u_int tpm_seq;
+ struct timeval tpm_time;
};
#define TPMEASN 4000
-extern int tp_Measn;
+extern int tp_Measn;
extern struct tp_Meas tp_Meas[];
/*
*/
#define TPtime_from_session 0x01
#define TPtime_to_session 0x02
-#define TPtime_ack_rcvd 0x03
+#define TPtime_ack_rcvd 0x03
#define TPtime_ack_sent 0x04
#define TPtime_from_ll 0x05
#define TPtime_to_ll 0x06
-#define TPsbsend 0x07
+#define TPsbsend 0x07
#define TPtime_open 0x08
-#define TPtime_open_X 0x28 /* xtd format */
+#define TPtime_open_X 0x28 /* xtd format */
#define TPtime_close 0x09
-#endif /* TP_PERF_MEAS */
+#endif /* TP_PERF_MEAS */
-/* $NetBSD: tp_output.c,v 1.10 1995/08/17 02:57:34 mycroft Exp $ */
+/* $OpenBSD: tp_output.c,v 1.2 1996/03/04 10:36:13 mickey Exp $ */
+/* $NetBSD: tp_output.c,v 1.11 1996/02/13 22:11:25 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
/*
* ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison
*/
-/*
+/*
* In here is tp_ctloutput(), the guy called by [sg]etsockopt(),
*/
#include <netiso/argo_debug.h>
#include <netiso/tp_pcb.h>
#include <netiso/tp_trace.h>
+#include <netiso/tp_var.h>
#define TPDUSIZESHIFT 24
#define CLASSHIFT 16
* the input arguements iff no errors were encountered.
* Strict means that no inconsistency will be tolerated. If it's
* not used, checksum and tpdusize inconsistencies will be tolerated.
- * The reason for this is that in some cases, when we're negotiating down
- * from class 4, these options should be changed but should not
+ * The reason for this is that in some cases, when we're negotiating down
+ * from class 4, these options should be changed but should not
* cause negotiation to fail.
*
* RETURNS
*/
int
-tp_consistency( tpcb, cmd, param )
- u_int cmd;
+tp_consistency(tpcb, cmd, param)
+ u_int cmd;
struct tp_conn_param *param;
- struct tp_pcb *tpcb;
+ struct tp_pcb *tpcb;
{
- register int error = EOK;
- int class_to_use = tp_mask_to_num(param->p_class);
-
- IFTRACE(D_SETPARAMS)
- tptrace(TPPTmisc,
- "tp_consist enter class_to_use dontchange param.class cmd",
- class_to_use, param->p_dont_change_params, param->p_class, cmd);
- ENDTRACE
- IFDEBUG(D_SETPARAMS)
- printf("tp_consistency %s %s\n",
- cmd& TP_FORCE? "TP_FORCE": "",
- cmd& TP_STRICT? "TP_STRICT":"");
- ENDDEBUG
+ register int error = EOK;
+ int class_to_use = tp_mask_to_num(param->p_class);
+
+#ifdef TPPT
+ if (tp_traceflags[D_SETPARAMS]) {
+ tptrace(TPPTmisc,
+ "tp_consist enter class_to_use dontchange param.class cmd",
+ class_to_use, param->p_dont_change_params, param->p_class, cmd);
+ }
+#endif
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_SETPARAMS]) {
+ printf("tp_consistency %s %s\n",
+ cmd & TP_FORCE ? "TP_FORCE" : "",
+ cmd & TP_STRICT ? "TP_STRICT" : "");
+ }
+#endif
if ((cmd & TP_FORCE) && (param->p_dont_change_params)) {
cmd &= ~TP_FORCE;
}
- /* can switch net services within a domain, but
- * cannot switch domains
+ /*
+ * can switch net services within a domain, but cannot switch domains
*/
- switch( param->p_netservice) {
+ switch (param->p_netservice) {
case ISO_CONS:
case ISO_CLNS:
case ISO_COSNS:
/* param->p_netservice in ISO DOMAIN */
- if(tpcb->tp_domain != AF_ISO ) {
- error = EINVAL; goto done;
+ if (tpcb->tp_domain != AF_ISO) {
+ error = EINVAL;
+ goto done;
}
break;
case IN_CLNS:
/* param->p_netservice in INET DOMAIN */
- if( tpcb->tp_domain != AF_INET ) {
- error = EINVAL; goto done;
+ if (tpcb->tp_domain != AF_INET) {
+ error = EINVAL;
+ goto done;
}
break;
/* no others not possible-> netservice is a 2-bit field! */
}
- IFDEBUG(D_SETPARAMS)
- printf("p_class 0x%x, class_to_use 0x%x\n", param->p_class,
- class_to_use);
- ENDDEBUG
- if((param->p_netservice > TP_MAX_NETSERVICES)){
- error = EINVAL; goto done;
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_SETPARAMS]) {
+ printf("p_class 0x%x, class_to_use 0x%x\n", param->p_class,
+ class_to_use);
+ }
+#endif
+ if ((param->p_netservice > TP_MAX_NETSERVICES)) {
+ error = EINVAL;
+ goto done;
+ }
+ if ((param->p_class & TP_CLASSES_IMPLEMENTED) == 0) {
+ error = EINVAL;
+ goto done;
}
- if( (param->p_class & TP_CLASSES_IMPLEMENTED) == 0 ) {
- error = EINVAL; goto done;
- }
- IFDEBUG(D_SETPARAMS)
- printf("Nretrans 0x%x\n", param->p_Nretrans );
- ENDDEBUG
- if( ( param->p_Nretrans < 1 ) ||
- (param->p_cr_ticks < 1) || (param->p_cc_ticks < 1) ) {
- /* bad for any class because negot has to be done a la class 4 */
- error = EINVAL; goto done;
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_SETPARAMS]) {
+ printf("Nretrans 0x%x\n", param->p_Nretrans);
}
- IFDEBUG(D_SETPARAMS)
- printf("use_csum 0x%x\n", param->p_use_checksum );
- printf("xtd_format 0x%x\n", param->p_xtd_format );
- printf("xpd_service 0x%x\n", param->p_xpd_service );
- printf("tpdusize 0x%x\n", param->p_tpdusize );
- printf("tpcb->flags 0x%x\n", tpcb->tp_flags );
- ENDDEBUG
- switch( class_to_use ) {
+#endif
+ if ((param->p_Nretrans < 1) ||
+ (param->p_cr_ticks < 1) || (param->p_cc_ticks < 1)) {
+ /*
+ * bad for any class because negot has to be done a la class
+ * 4
+ */
+ error = EINVAL;
+ goto done;
+ }
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_SETPARAMS]) {
+ printf("use_csum 0x%x\n", param->p_use_checksum);
+ printf("xtd_format 0x%x\n", param->p_xtd_format);
+ printf("xpd_service 0x%x\n", param->p_xpd_service);
+ printf("tpdusize 0x%x\n", param->p_tpdusize);
+ printf("tpcb->flags 0x%x\n", tpcb->tp_flags);
+ }
+#endif
+ switch (class_to_use) {
case 0:
/* do not use checksums, xtd format, or XPD */
- if( param->p_use_checksum | param->p_xtd_format | param->p_xpd_service ) {
- if(cmd & TP_STRICT) {
+ if (param->p_use_checksum | param->p_xtd_format | param->p_xpd_service) {
+ if (cmd & TP_STRICT) {
error = EINVAL;
} else {
param->p_use_checksum = 0;
}
break;
}
-
if (param->p_tpdusize < TP_MIN_TPDUSIZE) {
- if(cmd & TP_STRICT) {
+ if (cmd & TP_STRICT) {
error = EINVAL;
} else {
param->p_tpdusize = TP_MIN_TPDUSIZE;
}
break;
}
- if (param->p_tpdusize > TP0_TPDUSIZE) {
+ if (param->p_tpdusize > TP0_TPDUSIZE) {
if (cmd & TP_STRICT) {
- error = EINVAL;
+ error = EINVAL;
} else {
param->p_tpdusize = TP0_TPDUSIZE;
}
break;
- }
-
+ }
/* connect/disc data not allowed for class 0 */
if (tpcb->tp_ucddata) {
- if(cmd & TP_STRICT) {
+ if (cmd & TP_STRICT) {
error = EINVAL;
- } else if(cmd & TP_FORCE) {
+ } else if (cmd & TP_FORCE) {
m_freem(tpcb->tp_ucddata);
tpcb->tp_ucddata = 0;
}
}
break;
-
+
case 4:
- IFDEBUG(D_SETPARAMS)
- printf("dt_ticks 0x%x\n", param->p_dt_ticks );
- printf("x_ticks 0x%x\n", param->p_x_ticks );
- printf("dr_ticks 0x%x\n", param->p_dr_ticks );
- printf("keepalive 0x%x\n", param->p_keepalive_ticks );
- printf("sendack 0x%x\n", param->p_sendack_ticks );
- printf("inact 0x%x\n", param->p_inact_ticks );
- printf("ref 0x%x\n", param->p_ref_ticks );
- ENDDEBUG
- if( (param->p_class & TP_CLASS_4 ) && (
- (param->p_dt_ticks < 1) || (param->p_dr_ticks < 1) ||
- (param->p_x_ticks < 1) || (param->p_keepalive_ticks < 1) ||
- (param->p_sendack_ticks < 1) || (param->p_ref_ticks < 1) ||
- (param->p_inact_ticks < 1) ) ) {
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_SETPARAMS]) {
+ printf("dt_ticks 0x%x\n", param->p_dt_ticks);
+ printf("x_ticks 0x%x\n", param->p_x_ticks);
+ printf("dr_ticks 0x%x\n", param->p_dr_ticks);
+ printf("keepalive 0x%x\n", param->p_keepalive_ticks);
+ printf("sendack 0x%x\n", param->p_sendack_ticks);
+ printf("inact 0x%x\n", param->p_inact_ticks);
+ printf("ref 0x%x\n", param->p_ref_ticks);
+ }
+#endif
+ if ((param->p_class & TP_CLASS_4) && (
+ (param->p_dt_ticks < 1) || (param->p_dr_ticks < 1) ||
+ (param->p_x_ticks < 1) || (param->p_keepalive_ticks < 1) ||
+ (param->p_sendack_ticks < 1) || (param->p_ref_ticks < 1) ||
+ (param->p_inact_ticks < 1))) {
+ error = EINVAL;
+ break;
+ }
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_SETPARAMS]) {
+ printf("rx_strat 0x%x\n", param->p_rx_strat);
+ }
+#endif
+ if (param->p_rx_strat >
+ (TPRX_USE_CW | TPRX_EACH | TPRX_FASTSTART)) {
+ if (cmd & TP_STRICT) {
error = EINVAL;
- break;
- }
- IFDEBUG(D_SETPARAMS)
- printf("rx_strat 0x%x\n", param->p_rx_strat );
- ENDDEBUG
- if(param->p_rx_strat >
- ( TPRX_USE_CW | TPRX_EACH | TPRX_FASTSTART) ) {
- if(cmd & TP_STRICT) {
- error = EINVAL;
- } else {
- param->p_rx_strat = TPRX_USE_CW;
- }
- break;
- }
- IFDEBUG(D_SETPARAMS)
- printf("ack_strat 0x%x\n", param->p_ack_strat );
- ENDDEBUG
- if((param->p_ack_strat != 0) && (param->p_ack_strat != 1)) {
- if(cmd & TP_STRICT) {
+ } else {
+ param->p_rx_strat = TPRX_USE_CW;
+ }
+ break;
+ }
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_SETPARAMS]) {
+ printf("ack_strat 0x%x\n", param->p_ack_strat);
+ }
+#endif
+ if ((param->p_ack_strat != 0) && (param->p_ack_strat != 1)) {
+ if (cmd & TP_STRICT) {
error = EINVAL;
} else {
param->p_ack_strat = TPACK_WINDOW;
break;
}
if (param->p_tpdusize < TP_MIN_TPDUSIZE) {
- if(cmd & TP_STRICT) {
+ if (cmd & TP_STRICT) {
error = EINVAL;
} else {
param->p_tpdusize = TP_MIN_TPDUSIZE;
}
break;
}
- if (param->p_tpdusize > TP_TPDUSIZE) {
- if(cmd & TP_STRICT) {
- error = EINVAL;
+ if (param->p_tpdusize > TP_TPDUSIZE) {
+ if (cmd & TP_STRICT) {
+ error = EINVAL;
} else {
param->p_tpdusize = TP_TPDUSIZE;
}
break;
- }
+ }
break;
}
- if ((error==0) && (cmd & TP_FORCE)) {
- long dusize = ((long)param->p_ptpdusize) << 7;
+ if ((error == 0) && (cmd & TP_FORCE)) {
+ long dusize = ((long) param->p_ptpdusize) << 7;
/* Enforce Negotation rules below */
tpcb->tp_class = param->p_class;
if (tpcb->tp_use_checksum || param->p_use_checksum)
if (tpcb->tp_l_tpdusize > dusize)
tpcb->tp_l_tpdusize = dusize;
if (tpcb->tp_ptpdusize == 0 ||
- tpcb->tp_ptpdusize > param->p_ptpdusize)
+ tpcb->tp_ptpdusize > param->p_ptpdusize)
tpcb->tp_ptpdusize = param->p_ptpdusize;
} else {
if (param->p_tpdusize != 0 &&
- tpcb->tp_tpdusize > param->p_tpdusize)
+ tpcb->tp_tpdusize > param->p_tpdusize)
tpcb->tp_tpdusize = param->p_tpdusize;
tpcb->tp_l_tpdusize = 1 << tpcb->tp_tpdusize;
}
}
done:
- IFTRACE(D_CONN)
- tptrace(TPPTmisc, "tp_consist returns class xtdfmt cmd",
+#ifdef TPPT
+ if (tp_traceflags[D_CONN]) {
+ tptrace(TPPTmisc, "tp_consist returns class xtdfmt cmd",
error, tpcb->tp_class, tpcb->tp_xtd_format, cmd);
- ENDTRACE
- IFDEBUG(D_CONN)
+ }
+#endif
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
printf(
- "tp_consist rtns 0x%x class 0x%x xtd_fmt 0x%x cmd 0x%x\n",
- error, tpcb->tp_class, tpcb->tp_xtd_format, cmd);
- ENDDEBUG
+ "tp_consist rtns 0x%x class 0x%x xtd_fmt 0x%x cmd 0x%x\n",
+ error, tpcb->tp_class, tpcb->tp_xtd_format, cmd);
+ }
+#endif
return error;
}
* NAME: tp_ctloutput()
*
* CALLED FROM:
- * [sg]etsockopt(), via so[sg]etopt().
+ * [sg]etsockopt(), via so[sg]etopt().
*
* FUNCTION and ARGUMENTS:
* Implements the socket options at transport level.
* (so) is the socket.
* (level) is SOL_TRANSPORT (see ../sys/socket.h)
* (optname) is the particular command or option to be set.
- * (**mp) is an mbuf structure.
+ * (**mp) is an mbuf structure.
*
* RETURN VALUE:
* ENOTSOCK if the socket hasn't got an associated tpcb
- * EINVAL if
+ * EINVAL if
* trying to set window too big
- * trying to set illegal max tpdu size
+ * trying to set illegal max tpdu size
* trying to set illegal credit fraction
* trying to use unknown or unimplemented class of TP
* structure passed to set timer values is wrong size
- * illegal combination of command/GET-SET option,
- * e.g., GET w/ TPOPT_CDDATA_CLEAR:
+ * illegal combination of command/GET-SET option,
+ * e.g., GET w/ TPOPT_CDDATA_CLEAR:
* EOPNOTSUPP if the level isn't transport, or command is neither GET nor SET
* or if the transport-specific command is not implemented
* EISCONN if trying a command that isn't allowed after a connection
*/
int
tp_ctloutput(cmd, so, level, optname, mp)
- int cmd, level, optname;
- struct socket *so;
- struct mbuf **mp;
+ int cmd, level, optname;
+ struct socket *so;
+ struct mbuf **mp;
{
- struct tp_pcb *tpcb = sototpcb(so);
- int s = splsoftnet();
- caddr_t value;
- unsigned val_len;
- int error = 0;
-
- IFTRACE(D_REQUEST)
- tptrace(TPPTmisc, "tp_ctloutput cmd so optname mp",
+ struct tp_pcb *tpcb = sototpcb(so);
+ int s = splsoftnet();
+ caddr_t value;
+ unsigned val_len;
+ int error = 0;
+
+#ifdef TPPT
+ if (tp_traceflags[D_REQUEST]) {
+ tptrace(TPPTmisc, "tp_ctloutput cmd so optname mp",
cmd, so, optname, mp);
- ENDTRACE
- IFDEBUG(D_REQUEST)
+ }
+#endif
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_REQUEST]) {
printf(
- "tp_ctloutput so 0x%x cmd 0x%x optname 0x%x, mp 0x%x *mp 0x%x tpcb 0x%x\n",
- so, cmd, optname, mp, mp?*mp:0, tpcb);
- ENDDEBUG
- if( tpcb == (struct tp_pcb *)0 ) {
- error = ENOTSOCK; goto done;
+ "tp_ctloutput so 0x%x cmd 0x%x optname 0x%x, mp 0x%x *mp 0x%x tpcb 0x%x\n",
+ so, cmd, optname, mp, mp ? *mp : 0, tpcb);
+ }
+#endif
+ if (tpcb == (struct tp_pcb *) 0) {
+ error = ENOTSOCK;
+ goto done;
}
- if(*mp == MNULL) {
+ if (*mp == MNULL) {
register struct mbuf *m;
- MGET(m, M_DONTWAIT, TPMT_SONAME); /* does off, type, next */
+ MGET(m, M_DONTWAIT, TPMT_SONAME); /* does off, type, next */
if (m == NULL) {
splx(s);
return ENOBUFS;
m->m_act = 0;
*mp = m;
}
-
/*
* Hook so one can set network options via a tp socket.
*/
- if ( level == SOL_NETWORK ) {
+ if (level == SOL_NETWORK) {
if ((tpcb->tp_nlproto == NULL) || (tpcb->tp_npcb == NULL))
error = ENOTSOCK;
else if (tpcb->tp_nlproto->nlp_ctloutput == NULL)
error = EOPNOTSUPP;
else
- return ((tpcb->tp_nlproto->nlp_ctloutput)(cmd, optname,
- tpcb->tp_npcb, *mp));
+ return ((tpcb->tp_nlproto->nlp_ctloutput) (cmd, optname,
+ tpcb->tp_npcb, *mp));
goto done;
- } else if ( level == SOL_SOCKET) {
+ } else if (level == SOL_SOCKET) {
if (optname == SO_RCVBUF && cmd == PRCO_SETOPT) {
- u_long old_credit = tpcb->tp_maxlcredit;
+ u_long old_credit = tpcb->tp_maxlcredit;
tp_rsyset(tpcb);
if (tpcb->tp_rhiwat != so->so_rcv.sb_hiwat &&
tpcb->tp_state == TP_OPEN &&
tpcb->tp_rhiwat = so->so_rcv.sb_hiwat;
}
goto done;
- } else if ( level != SOL_TRANSPORT ) {
- error = EOPNOTSUPP; goto done;
- }
+ } else if (level != SOL_TRANSPORT) {
+ error = EOPNOTSUPP;
+ goto done;
+ }
if (cmd != PRCO_GETOPT && cmd != PRCO_SETOPT) {
- error = EOPNOTSUPP; goto done;
- }
- if ( so->so_error ) {
- error = so->so_error; goto done;
+ error = EOPNOTSUPP;
+ goto done;
}
-
- /* The only options allowed after connection is established
- * are GET (anything) and SET DISC DATA and SET PERF MEAS
+ if (so->so_error) {
+ error = so->so_error;
+ goto done;
+ }
+ /*
+ * The only options allowed after connection is established are GET
+ * (anything) and SET DISC DATA and SET PERF MEAS
*/
- if ( ((so->so_state & SS_ISCONNECTING)||(so->so_state & SS_ISCONNECTED))
- &&
- (cmd == PRCO_SETOPT &&
- optname != TPOPT_DISC_DATA &&
- optname != TPOPT_CFRM_DATA &&
- optname != TPOPT_PERF_MEAS &&
- optname != TPOPT_CDDATA_CLEAR ) ) {
- error = EISCONN; goto done;
- }
- /* The only options allowed after disconnection are GET DISC DATA,
- * and TPOPT_PSTATISTICS
- * and they're not allowed if the ref timer has gone off, because
- * the tpcb is gone
+ if (((so->so_state & SS_ISCONNECTING) || (so->so_state & SS_ISCONNECTED))
+ &&
+ (cmd == PRCO_SETOPT &&
+ optname != TPOPT_DISC_DATA &&
+ optname != TPOPT_CFRM_DATA &&
+ optname != TPOPT_PERF_MEAS &&
+ optname != TPOPT_CDDATA_CLEAR)) {
+ error = EISCONN;
+ goto done;
+ }
+ /*
+ * The only options allowed after disconnection are GET DISC DATA,
+ * and TPOPT_PSTATISTICS and they're not allowed if the ref timer has
+ * gone off, because the tpcb is gone
*/
- if ((so->so_state & (SS_ISCONNECTED | SS_ISCONFIRMING)) == 0) {
- if ( so->so_pcb == 0 ) {
- error = ENOTCONN; goto done;
+ if ((so->so_state & (SS_ISCONNECTED | SS_ISCONFIRMING)) == 0) {
+ if (so->so_pcb == 0) {
+ error = ENOTCONN;
+ goto done;
}
- if ( (tpcb->tp_state == TP_REFWAIT || tpcb->tp_state == TP_CLOSING) &&
- (optname != TPOPT_DISC_DATA && optname != TPOPT_PSTATISTICS)) {
- error = ENOTCONN; goto done;
+ if ((tpcb->tp_state == TP_REFWAIT || tpcb->tp_state == TP_CLOSING) &&
+ (optname != TPOPT_DISC_DATA && optname != TPOPT_PSTATISTICS)) {
+ error = ENOTCONN;
+ goto done;
}
}
-
- value = mtod(*mp, caddr_t); /* it's aligned, don't worry,
- * but lint complains about it
- */
+ value = mtod(*mp, caddr_t); /* it's aligned, don't worry, but
+ * lint complains about it */
val_len = (*mp)->m_len;
switch (optname) {
if ((so->so_state & SS_PRIV) == 0) {
error = EPERM;
} else if (cmd != PRCO_SETOPT || tpcb->tp_state != TP_CLOSED ||
- (tpcb->tp_flags & TPF_GENERAL_ADDR) ||
- tpcb->tp_next == 0)
+ (tpcb->tp_flags & TPF_GENERAL_ADDR) ||
+ tpcb->tp_next == 0)
error = EINVAL;
else {
register struct tp_pcb *t;
error = EADDRINUSE;
for (t = tp_listeners; t; t = t->tp_nextlisten)
if ((t->tp_flags & TPF_GENERAL_ADDR) == 0 &&
- t->tp_domain == tpcb->tp_domain)
+ t->tp_domain == tpcb->tp_domain)
switch (tpcb->tp_domain) {
default:
goto done;
#ifdef ISO
case AF_ISO:
if (bcmp(ISOA(t).isoa_genaddr, ISOA(tpcb).isoa_genaddr,
- ISOA(t).isoa_len) == 0)
+ ISOA(t).isoa_len) == 0)
goto done;
continue;
#endif
break;
case TPOPT_MY_TSEL:
- if ( cmd == PRCO_GETOPT ) {
- ASSERT( tpcb->tp_lsuffixlen <= MAX_TSAP_SEL_LEN );
- bcopy((caddr_t)tpcb->tp_lsuffix, value, tpcb->tp_lsuffixlen);
+ if (cmd == PRCO_GETOPT) {
+ ASSERT(tpcb->tp_lsuffixlen <= MAX_TSAP_SEL_LEN);
+ bcopy((caddr_t) tpcb->tp_lsuffix, value, tpcb->tp_lsuffixlen);
(*mp)->m_len = tpcb->tp_lsuffixlen;
- } else /* cmd == PRCO_SETOPT */ {
- if( (val_len > MAX_TSAP_SEL_LEN) || (val_len <= 0 )) {
+ } else { /* cmd == PRCO_SETOPT */
+ if ((val_len > MAX_TSAP_SEL_LEN) || (val_len <= 0)) {
printf("val_len 0x%x (*mp)->m_len 0x%x\n", val_len, (*mp));
error = EINVAL;
} else {
- bcopy(value, (caddr_t)tpcb->tp_lsuffix, val_len);
+ bcopy(value, (caddr_t) tpcb->tp_lsuffix, val_len);
tpcb->tp_lsuffixlen = val_len;
}
}
break;
case TPOPT_PEER_TSEL:
- if ( cmd == PRCO_GETOPT ) {
- ASSERT( tpcb->tp_fsuffixlen <= MAX_TSAP_SEL_LEN );
- bcopy((caddr_t)tpcb->tp_fsuffix, value, tpcb->tp_fsuffixlen);
+ if (cmd == PRCO_GETOPT) {
+ ASSERT(tpcb->tp_fsuffixlen <= MAX_TSAP_SEL_LEN);
+ bcopy((caddr_t) tpcb->tp_fsuffix, value, tpcb->tp_fsuffixlen);
(*mp)->m_len = tpcb->tp_fsuffixlen;
- } else /* cmd == PRCO_SETOPT */ {
- if( (val_len > MAX_TSAP_SEL_LEN) || (val_len <= 0 )) {
+ } else { /* cmd == PRCO_SETOPT */
+ if ((val_len > MAX_TSAP_SEL_LEN) || (val_len <= 0)) {
printf("val_len 0x%x (*mp)->m_len 0x%x\n", val_len, (*mp));
- error = EINVAL;
+ error = EINVAL;
} else {
- bcopy(value, (caddr_t)tpcb->tp_fsuffix, val_len);
+ bcopy(value, (caddr_t) tpcb->tp_fsuffix, val_len);
tpcb->tp_fsuffixlen = val_len;
}
}
break;
case TPOPT_FLAGS:
- IFDEBUG(D_REQUEST)
- printf("%s TPOPT_FLAGS value 0x%x *value 0x%x, flags 0x%x \n",
- cmd==PRCO_GETOPT?"GET":"SET",
- value,
- *value,
- tpcb->tp_flags);
- ENDDEBUG
-
- if ( cmd == PRCO_GETOPT ) {
- *(int *)value = (int)tpcb->tp_flags;
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_REQUEST]) {
+ printf("%s TPOPT_FLAGS value 0x%x *value 0x%x, flags 0x%x \n",
+ cmd == PRCO_GETOPT ? "GET" : "SET",
+ value,
+ *value,
+ tpcb->tp_flags);
+ }
+#endif
+
+ if (cmd == PRCO_GETOPT) {
+ *(int *) value = (int) tpcb->tp_flags;
(*mp)->m_len = sizeof(u_int);
- } else /* cmd == PRCO_SETOPT */ {
- error = EINVAL; goto done;
+ } else { /* cmd == PRCO_SETOPT */
+ error = EINVAL;
+ goto done;
}
break;
case TPOPT_PARAMS:
- /* This handles:
- * timer values,
- * class, use of transport expedited data,
- * max tpdu size, checksum, xtd format and
- * disconnect indications, and may get rid of connect/disc data
+ /*
+ * This handles: timer values, class, use of transport
+ * expedited data, max tpdu size, checksum, xtd format and
+ * disconnect indications, and may get rid of connect/disc
+ * data
*/
- IFDEBUG(D_SETPARAMS)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_SETPARAMS]) {
printf("TPOPT_PARAMS value 0x%x, cmd %s \n", value,
- cmd==PRCO_GETOPT?"GET":"SET");
- ENDDEBUG
- IFDEBUG(D_REQUEST)
+ cmd == PRCO_GETOPT ? "GET" : "SET");
+ }
+#endif
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_REQUEST]) {
printf("TPOPT_PARAMS value 0x%x, cmd %s \n", value,
- cmd==PRCO_GETOPT?"GET":"SET");
- ENDDEBUG
+ cmd == PRCO_GETOPT ? "GET" : "SET");
+ }
+#endif
- if ( cmd == PRCO_GETOPT ) {
- *(struct tp_conn_param *)value = tpcb->_tp_param;
+ if (cmd == PRCO_GETOPT) {
+ *(struct tp_conn_param *) value = tpcb->_tp_param;
(*mp)->m_len = sizeof(tpcb->_tp_param);
- } else /* cmd == PRCO_SETOPT */ {
- if( (error =
- tp_consistency(tpcb, TP_STRICT | TP_FORCE,
- (struct tp_conn_param *)value))==0) {
- /*
- * tp_consistency doesn't copy the whole set of params
+ } else { /* cmd == PRCO_SETOPT */
+ if ((error =
+ tp_consistency(tpcb, TP_STRICT | TP_FORCE,
+ (struct tp_conn_param *) value)) == 0) {
+ /*
+ * tp_consistency doesn't copy the whole set
+ * of params
*/
- tpcb->_tp_param = *(struct tp_conn_param *)value;
+ tpcb->_tp_param = *(struct tp_conn_param *) value;
(*mp)->m_len = sizeof(tpcb->_tp_param);
}
}
break;
- case TPOPT_PSTATISTICS:
+ case TPOPT_PSTATISTICS:
#ifdef TP_PERF_MEAS
if (cmd == PRCO_SETOPT) {
- error = EINVAL; goto done;
- }
- IFPERF(tpcb)
+ error = EINVAL;
+ goto done;
+ }
+ if (tpcb->tp_perf_on) {
MCLGET(*mp, M_WAITOK);
if (((*mp)->m_flags & M_EXT) == 0) {
error = ENOBUFS; goto done;
}
(*mp)->m_len = sizeof(struct tp_pmeas);
bcopy(tpcb->tp_p_meas, mtod(*mp), sizeof(struct tp_pmeas));
- ENDPERF
+ }
else {
- error = EINVAL; goto done;
- }
+ error = EINVAL;
+ goto done;
+ }
break;
#else
error = EOPNOTSUPP;
goto done;
-#endif /* TP_PERF_MEAS */
-
- case TPOPT_CDDATA_CLEAR:
+#endif /* TP_PERF_MEAS */
+
+ case TPOPT_CDDATA_CLEAR:
if (cmd == PRCO_GETOPT) {
error = EINVAL;
} else {
break;
case TPOPT_CFRM_DATA:
- case TPOPT_DISC_DATA:
- case TPOPT_CONN_DATA:
- if( tpcb->tp_class == TP_CLASS_0 ) {
+ case TPOPT_DISC_DATA:
+ case TPOPT_CONN_DATA:
+ if (tpcb->tp_class == TP_CLASS_0) {
error = EOPNOTSUPP;
break;
}
- IFDEBUG(D_REQUEST)
- printf("%s\n", optname==TPOPT_DISC_DATA?"DISC data":"CONN data");
- printf("m_len 0x%x, vallen 0x%x so_snd.cc 0x%x\n",
- (*mp)->m_len, val_len, so->so_snd.sb_cc);
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_REQUEST]) {
+ printf("%s\n", optname == TPOPT_DISC_DATA ? "DISC data" : "CONN data");
+ printf("m_len 0x%x, vallen 0x%x so_snd.cc 0x%x\n",
+ (*mp)->m_len, val_len, so->so_snd.sb_cc);
dump_mbuf(so->so_snd.sb_mb, "tp_ctloutput: sosnd ");
- ENDDEBUG
+ }
+#endif
if (cmd == PRCO_SETOPT) {
- int len = tpcb->tp_ucddata ? tpcb->tp_ucddata->m_len : 0;
+ int len = tpcb->tp_ucddata ? tpcb->tp_ucddata->m_len : 0;
/* can append connect data in several calls */
- if (len + val_len >
- (optname==TPOPT_CONN_DATA?TP_MAX_CR_DATA:TP_MAX_DR_DATA) ) {
- error = EMSGSIZE; goto done;
- }
+ if (len + val_len >
+ (optname == TPOPT_CONN_DATA ? TP_MAX_CR_DATA : TP_MAX_DR_DATA)) {
+ error = EMSGSIZE;
+ goto done;
+ }
(*mp)->m_next = MNULL;
(*mp)->m_act = 0;
if (tpcb->tp_ucddata)
m_cat(tpcb->tp_ucddata, *mp);
else
tpcb->tp_ucddata = *mp;
- IFDEBUG(D_REQUEST)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_REQUEST]) {
dump_mbuf(tpcb->tp_ucddata, "tp_ctloutput after CONN_DATA");
- ENDDEBUG
- IFTRACE(D_REQUEST)
- tptrace(TPPTmisc,"C/D DATA: flags snd.sbcc val_len",
- tpcb->tp_flags, so->so_snd.sb_cc,val_len,0);
- ENDTRACE
+ }
+#endif
+#ifdef TPPT
+ if (tp_traceflags[D_REQUEST]) {
+ tptrace(TPPTmisc, "C/D DATA: flags snd.sbcc val_len",
+ tpcb->tp_flags, so->so_snd.sb_cc, val_len, 0);
+ }
+#endif
*mp = MNULL;
if (optname == TPOPT_CFRM_DATA && (so->so_state & SS_ISCONFIRMING))
(void) tp_confirm(tpcb);
}
break;
- case TPOPT_PERF_MEAS:
+ case TPOPT_PERF_MEAS:
#ifdef TP_PERF_MEAS
if (cmd == PRCO_GETOPT) {
- *value = (u_int)tpcb->tp_perf_on;
+ *value = (u_int) tpcb->tp_perf_on;
(*mp)->m_len = sizeof(u_int);
} else if (cmd == PRCO_SETOPT) {
(*mp)->m_len = 0;
- if ((*value) != 0 && (*value) != 1 )
+ if ((*value) != 0 && (*value) != 1)
error = EINVAL;
- else tpcb->tp_perf_on = (*value);
+ else
+ tpcb->tp_perf_on = (*value);
}
- if( tpcb->tp_perf_on )
+ if (tpcb->tp_perf_on)
error = tp_setup_perf(tpcb);
-#else /* TP_PERF_MEAS */
+#else /* TP_PERF_MEAS */
error = EOPNOTSUPP;
-#endif /* TP_PERF_MEAS */
+#endif /* TP_PERF_MEAS */
break;
default:
error = EOPNOTSUPP;
}
-
+
done:
- IFDEBUG(D_REQUEST)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_REQUEST]) {
dump_mbuf(so->so_snd.sb_mb, "tp_ctloutput sosnd at end");
dump_mbuf(*mp, "tp_ctloutput *mp");
- ENDDEBUG
- /*
- * sigh: getsockopt looks only at m_len : all output data must
- * reside in the first mbuf
+ }
+#endif
+ /*
+ * sigh: getsockopt looks only at m_len : all output data must reside
+ * in the first mbuf
*/
if (*mp) {
if (cmd == PRCO_SETOPT) {
m_freem(*mp);
*mp = MNULL;
} else {
- ASSERT ( m_compress(*mp, mp) <= MLEN );
+ ASSERT(m_compress(*mp, mp) <= MLEN);
if (error)
(*mp)->m_len = 0;
- IFDEBUG(D_REQUEST)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_REQUEST]) {
dump_mbuf(*mp, "tp_ctloutput *mp after compress");
- ENDDEBUG
+ }
+#endif
}
}
splx(s);
-/* $NetBSD: tp_param.h,v 1.8 1995/06/13 07:13:44 mycroft Exp $ */
+/* $OpenBSD: tp_param.h,v 1.2 1996/03/04 10:36:16 mickey Exp $ */
+/* $NetBSD: tp_param.h,v 1.9 1996/02/13 22:11:32 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
* compile time parameters that can be changed
*****************************************************/
-#define TP_CLASSES_IMPLEMENTED 0x11 /* zero and 4 */
+#define TP_CLASSES_IMPLEMENTED 0x11 /* zero and 4 */
#define TP_DECBIT_CLEAR_COUNT 3
-/*#define N_TPREF 100 */
+/* #define N_TPREF 100 */
#ifdef _KERNEL
-extern int N_TPREF;
+extern int N_TPREF;
#endif
#define TP_SOCKBUFSIZE ((u_long)4096)
#define MAX_TSAP_SEL_LEN 64
/* maximum tpdu size we'll accept: */
-#define TP_TPDUSIZE 0xc /* 4096 octets for classes 1-4*/
-#define TP0_TPDUSIZE 0xb /* 2048 octets for class 0 */
-#define TP_DFL_TPDUSIZE 0x7 /* 128 octets default */
- /* NOTE: don't ever negotiate 8192 because could get
- * wraparound in checksumming
- * (No mtu is likely to be larger than 4K anyway...)
- */
-#define TP_NRETRANS 12 /* TCP_MAXRXTSHIFT + 1 */
-#define TP_MAXRXTSHIFT 6 /* factor of 64 */
+#define TP_TPDUSIZE 0xc /* 4096 octets for
+ * classes 1-4 */
+#define TP0_TPDUSIZE 0xb /* 2048 octets for class 0 */
+#define TP_DFL_TPDUSIZE 0x7 /* 128 octets default */
+/*
+ * NOTE: don't ever negotiate 8192 because could get wraparound in
+ * checksumming (No mtu is likely to be larger than 4K anyway...)
+ */
+#define TP_NRETRANS 12 /* TCP_MAXRXTSHIFT + 1 */
+#define TP_MAXRXTSHIFT 6 /* factor of 64 */
#define TP_MAXPORT 0xefff
-/* ALPHA: to be used in the context: gain= 1/(2**alpha), or
- * put another way, gaintimes(x) (x)>>alpha (forgetting the case alpha==0)
+/*
+ * ALPHA: to be used in the context: gain= 1/(2**alpha), or put another way,
+ * gaintimes(x) (x)>>alpha (forgetting the case alpha==0)
*/
-#define TP_RTT_ALPHA 3
+#define TP_RTT_ALPHA 3
#define TP_RTV_ALPHA 2
#define TP_REXMTVAL(tpcb)\
- ((tp_rttadd + (tpcb)->tp_rtt + ((tpcb)->tp_rtv) << 2) / tp_rttdiv)
+ (((tp_rttadd + (tpcb)->tp_rtt + ((tpcb)->tp_rtv)) << 2) / tp_rttdiv)
#define TP_RANGESET(tv, value, min, max) \
((tv = value) > (max) ? (tv = max) : (tv < min ? tv = min : tv))
/*
- * not sure how to treat data on disconnect
+ * not sure how to treat data on disconnect
*/
#define T_CONN_DATA 0x1
#define T_DISCONNECT 0x2
#define ACK_REORDER (1<< _ACK_REORDER_)
/******************************************************
- * constants used in the protocol
+ * constants used in the protocol
*****************************************************/
#define TP_VERSION 0x1
#define TP_MAX_HEADER_LEN 256
-#define TP_MIN_TPDUSIZE 0x7 /* 128 octets */
-#define TP_MAX_TPDUSIZE 0xd /* 8192 octets */
+#define TP_MIN_TPDUSIZE 0x7 /* 128 octets */
+#define TP_MAX_TPDUSIZE 0xd /* 8192 octets */
#define TP_MAX_XPD_DATA 0x10 /* 16 octets */
#define TP_MAX_CC_DATA 0x20 /* 32 octets */
#define TP_NML_FMT_BIT 0x80
#define TP_NML_FMT_MASK 0x7f
-/*
- * values for the tpdu_type field, 2nd byte in a tpdu
+/*
+ * values for the tpdu_type field, 2nd byte in a tpdu
*/
#define TP_MIN_TPDUTYPE 0x1
#define XPD_TPDU_type 0x1
#define XAK_TPDU_type 0x2
-#define GR_TPDU_type 0x3
+#define GR_TPDU_type 0x3
#define AK_TPDU_type 0x6
#define ER_TPDU_type 0x7
#define DR_TPDU_type 0x8
#define TP_MAX_TPDUTYPE 0xf
/*
- * identifiers for the variable-length options in tpdus
+ * identifiers for the variable-length options in tpdus
*/
#define TPP_acktime 0x85
#define TPP_addl_info 0xe0
#define TPP_tpdu_size 0xc0
#define TPP_calling_sufx 0xc1
-#define TPP_invalid_tpdu 0xc1 /* the bozos used a value twice */
+#define TPP_invalid_tpdu 0xc1 /* the bozos used a value
+ * twice */
#define TPP_called_sufx 0xc2
#define TPP_checksum 0xc3
#define TPP_vers 0xc4
#define TPP_security 0xc5
#define TPP_addl_opt 0xc6
#define TPP_alt_class 0xc7
-#define TPP_perf_meas 0xc8 /* local item : perf meas on, svp */
+#define TPP_perf_meas 0xc8 /* local item : perf meas on,
+ * svp */
#define TPP_ptpdu_size 0xf0 /* preferred TPDU size */
#define TPP_inact_time 0xf2 /* inactivity time exchanged */
*****************************************************/
#ifndef TRUE
#define TRUE 1
-#endif /* TRUE */
+#endif /* TRUE */
#ifndef FALSE
#define FALSE 0
-#endif /* FALSE */
+#endif /* FALSE */
#define TP_LOCAL 22
#define TP_FOREIGN 33
#ifndef EOK
#define EOK 0
-#endif /* EOK */
+#endif /* EOK */
#define TP_CLASS_0 (1<<0)
#define TP_CLASS_1 (1<<1)
#ifndef MNULL
#define MNULL (struct mbuf *)0
-#endif /* MNULL */
- /* if ../sys/mbuf.h gets MT_types up to 0x40, these will
- * have to be changed:
- */
-#define MT_XPD 0x44
+#endif /* MNULL */
+/*
+ * if ../sys/mbuf.h gets MT_types up to 0x40, these will have to be changed:
+ */
+#define MT_XPD 0x44
#define MT_EOT 0x40
#define TP_ENOREF 0x80000000
-typedef unsigned int SeqNum;
-typedef unsigned short RefNum;
+typedef unsigned int SeqNum;
+typedef unsigned short RefNum;
/******************************************************
* Macro used all over, for driver
(diffp)->tv_usec = 1000000 - (diffp)->tv_usec;\
}\
}
-
+
/******************************************************
* Macro used for changing types of mbufs
*****************************************************/
*****************************************************/
struct tp_vbp {
- u_char tpv_code;
- char tpv_len;
- char tpv_val;
+ u_char tpv_code;
+ char tpv_len;
+ char tpv_val;
};
#define vbptr(x) ((struct tp_vbp *)(x))
#define vbval(x,type) (*((type *)&(((struct tp_vbp *)(x))->tpv_val)))
/******************************************************
* Macro for the local credit:
* uses max transmission unit for the ll
- * (as modified by the max TPDU size negotiated)
+ * (as modified by the max TPDU size negotiated)
*****************************************************/
#if defined(ARGO_DEBUG)&&!defined(LOCAL_CREDIT_EXPAND)
} else \
(tpcb)->tp_lcredit = xxi; \
} }
-#endif /* ARGO_DEBUG */
+#endif /* ARGO_DEBUG */
#ifdef _KERNEL
-extern int tp_rttadd, tp_rttdiv;
+extern int tp_rttadd, tp_rttdiv;
#include <sys/syslog.h>
#define printf logpri(LOG_DEBUG),addlog
-#ifndef tp_NSTATES
+#ifndef tp_NSTATES
#include <netiso/tp_states.h>
#include <netiso/tp_events.h>
-#if defined(__STDC__) || defined(__cplusplus)
-#undef ATTR
-#define ATTR(X) ev_union.EV_ ## X
-#endif /* defined(__STDC__) || defined(__cplusplus) */
-#endif /* tp_NSTATES */
+#ifndef __CONCAT3
+# if __STDC__
+# define __CONCAT3(a,b,c) a ## b ## c
+# else
+# define __CONCAT3(a,b,c) a/**/b/**/c
+# endif /* __STDC__ */
+#endif
+
+#define TPDU_ATTR(X) __CONCAT3(ev_union.EV_,X,_TPDU)
+
+#endif /* tp_NSTATES */
#endif /* _KERNEL */
#endif /* _NETISO_TP_PARAM_H_ */
-/* $NetBSD: tp_pcb.c,v 1.10 1995/08/17 02:57:36 mycroft Exp $ */
+/* $OpenBSD: tp_pcb.c,v 1.2 1996/03/04 10:36:18 mickey Exp $ */
+/* $NetBSD: tp_pcb.c,v 1.12 1996/02/13 22:11:39 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
/*
* ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison
*/
-/*
- * This is the initialization and cleanup stuff -
- * for the tp machine in general as well as for the individual pcbs.
- * tp_init() is called at system startup. tp_attach() and tp_getref() are
- * called when a socket is created. tp_detach() and tp_freeref()
- * are called during the closing stage and/or when the reference timer
- * goes off.
- * tp_soisdisconnecting() and tp_soisdisconnected() are tp-specific
- * versions of soisconnect*
- * and are called (obviously) during the closing phase.
+/*
+ * This is the initialization and cleanup stuff - for the tp machine in
+ * general as well as for the individual pcbs. tp_init() is called at system
+ * startup. tp_attach() and tp_getref() are called when a socket is created.
+ * tp_detach() and tp_freeref() are called during the closing stage and/or
+ * when the reference timer goes off. tp_soisdisconnecting() and
+ * tp_soisdisconnected() are tp-specific versions of soisconnect* and are
+ * called (obviously) during the closing phase.
*/
#include <sys/param.h>
#include <netiso/tp_meas.h>
#include <netiso/tp_seq.h>
#include <netiso/tp_clnp.h>
+#include <netiso/tp_var.h>
-/* ticks are in units of:
- * 500 nano-fortnights ;-) or
- * 500 ms or
- * 1/2 second
+/*
+ * ticks are in units of: 500 nano-fortnights ;-) or 500 ms or 1/2 second
*/
struct tp_conn_param tp_conn_param[] = {
/* ISO_CLNS: TP4 CONNECTION LESS */
{
- TP_NRETRANS, /* short p_Nretrans; */
- 20, /* 10 sec */ /* short p_dr_ticks; */
+ TP_NRETRANS, /* short p_Nretrans; */
+ 20, /* 10 sec *//* short p_dr_ticks; */
- 20, /* 10 sec */ /* short p_cc_ticks; */
- 20, /* 10 sec */ /* short p_dt_ticks; */
+ 20, /* 10 sec *//* short p_cc_ticks; */
+ 20, /* 10 sec *//* short p_dt_ticks; */
- 40, /* 20 sec */ /* short p_x_ticks; */
- 80, /* 40 sec */ /* short p_cr_ticks;*/
+ 40, /* 20 sec *//* short p_x_ticks; */
+ 80, /* 40 sec *//* short p_cr_ticks; */
- 240, /* 2 min */ /* short p_keepalive_ticks;*/
- 10, /* 5 sec */ /* short p_sendack_ticks; */
+ 240, /* 2 min *//* short p_keepalive_ticks; */
+ 10, /* 5 sec *//* short p_sendack_ticks; */
- 600, /* 5 min */ /* short p_ref_ticks; */
- 360, /* 3 min */ /* short p_inact_ticks; */
+ 600, /* 5 min *//* short p_ref_ticks; */
+ 360, /* 3 min *//* short p_inact_ticks; */
- (short) 100, /* short p_lcdtfract */
+ (short) 100, /* short p_lcdtfract */
(short) TP_SOCKBUFSIZE, /* short p_winsize */
- TP_TPDUSIZE, /* u_char p_tpdusize */
-
- TPACK_WINDOW, /* 4 bits p_ack_strat */
- TPRX_USE_CW | TPRX_FASTSTART,
- /* 4 bits p_rx_strat*/
- TP_CLASS_4 | TP_CLASS_0,/* 5 bits p_class */
- 1, /* 1 bit xtd format */
- 1, /* 1 bit xpd service */
- 1, /* 1 bit use_checksum */
- 0, /* 1 bit use net xpd */
- 0, /* 1 bit use rcc */
- 0, /* 1 bit use efc */
- 1, /* no disc indications */
- 0, /* don't change params */
- ISO_CLNS, /* p_netservice */
+ TP_TPDUSIZE, /* u_char p_tpdusize */
+
+ TPACK_WINDOW, /* 4 bits p_ack_strat */
+ TPRX_USE_CW | TPRX_FASTSTART,
+ /* 4 bits p_rx_strat */
+ TP_CLASS_4 | TP_CLASS_0, /* 5 bits p_class */
+ 1, /* 1 bit xtd format */
+ 1, /* 1 bit xpd service */
+ 1, /* 1 bit use_checksum */
+ 0, /* 1 bit use net xpd */
+ 0, /* 1 bit use rcc */
+ 0, /* 1 bit use efc */
+ 1, /* no disc indications */
+ 0, /* don't change params */
+ ISO_CLNS, /* p_netservice */
},
/* IN_CLNS: TP4 CONNECTION LESS */
{
- TP_NRETRANS, /* short p_Nretrans; */
- 20, /* 10 sec */ /* short p_dr_ticks; */
+ TP_NRETRANS, /* short p_Nretrans; */
+ 20, /* 10 sec *//* short p_dr_ticks; */
- 20, /* 10 sec */ /* short p_cc_ticks; */
- 20, /* 10 sec */ /* short p_dt_ticks; */
+ 20, /* 10 sec *//* short p_cc_ticks; */
+ 20, /* 10 sec *//* short p_dt_ticks; */
- 40, /* 20 sec */ /* short p_x_ticks; */
- 80, /* 40 sec */ /* short p_cr_ticks;*/
+ 40, /* 20 sec *//* short p_x_ticks; */
+ 80, /* 40 sec *//* short p_cr_ticks; */
- 240, /* 2 min */ /* short p_keepalive_ticks;*/
- 10, /* 5 sec */ /* short p_sendack_ticks; */
+ 240, /* 2 min *//* short p_keepalive_ticks; */
+ 10, /* 5 sec *//* short p_sendack_ticks; */
- 600, /* 5 min */ /* short p_ref_ticks; */
- 360, /* 3 min */ /* short p_inact_ticks; */
+ 600, /* 5 min *//* short p_ref_ticks; */
+ 360, /* 3 min *//* short p_inact_ticks; */
- (short) 100, /* short p_lcdtfract */
+ (short) 100, /* short p_lcdtfract */
(short) TP_SOCKBUFSIZE, /* short p_winsize */
- TP_TPDUSIZE, /* u_char p_tpdusize */
-
- TPACK_WINDOW, /* 4 bits p_ack_strat */
- TPRX_USE_CW | TPRX_FASTSTART,
- /* 4 bits p_rx_strat*/
- TP_CLASS_4, /* 5 bits p_class */
- 1, /* 1 bit xtd format */
- 1, /* 1 bit xpd service */
- 1, /* 1 bit use_checksum */
- 0, /* 1 bit use net xpd */
- 0, /* 1 bit use rcc */
- 0, /* 1 bit use efc */
- 1, /* no disc indications */
- 0, /* don't change params */
- IN_CLNS, /* p_netservice */
+ TP_TPDUSIZE, /* u_char p_tpdusize */
+
+ TPACK_WINDOW, /* 4 bits p_ack_strat */
+ TPRX_USE_CW | TPRX_FASTSTART,
+ /* 4 bits p_rx_strat */
+ TP_CLASS_4, /* 5 bits p_class */
+ 1, /* 1 bit xtd format */
+ 1, /* 1 bit xpd service */
+ 1, /* 1 bit use_checksum */
+ 0, /* 1 bit use net xpd */
+ 0, /* 1 bit use rcc */
+ 0, /* 1 bit use efc */
+ 1, /* no disc indications */
+ 0, /* don't change params */
+ IN_CLNS, /* p_netservice */
},
/* ISO_CONS: TP0 CONNECTION MODE */
{
- TP_NRETRANS, /* short p_Nretrans; */
- 0, /* n/a */ /* short p_dr_ticks; */
+ TP_NRETRANS, /* short p_Nretrans; */
+ 0, /* n/a *//* short p_dr_ticks; */
- 40, /* 20 sec */ /* short p_cc_ticks; */
- 0, /* n/a */ /* short p_dt_ticks; */
+ 40, /* 20 sec *//* short p_cc_ticks; */
+ 0, /* n/a *//* short p_dt_ticks; */
- 0, /* n/a */ /* short p_x_ticks; */
- 360, /* 3 min */ /* short p_cr_ticks;*/
+ 0, /* n/a *//* short p_x_ticks; */
+ 360, /* 3 min *//* short p_cr_ticks; */
- 0, /* n/a */ /* short p_keepalive_ticks;*/
- 0, /* n/a */ /* short p_sendack_ticks; */
+ 0, /* n/a *//* short p_keepalive_ticks; */
+ 0, /* n/a *//* short p_sendack_ticks; */
- 600, /* for cr/cc to clear *//* short p_ref_ticks; */
- 0, /* n/a */ /* short p_inact_ticks; */
+ 600, /* for cr/cc to clear *//* short p_ref_ticks; */
+ 0, /* n/a *//* short p_inact_ticks; */
- /* Use tp4 defaults just in case the user changes ONLY
- * the class
+ /*
+ * Use tp4 defaults just in case the user changes ONLY the
+ * class
*/
- (short) 100, /* short p_lcdtfract */
+ (short) 100, /* short p_lcdtfract */
(short) TP0_SOCKBUFSIZE, /* short p_winsize */
- TP0_TPDUSIZE, /* 8 bits p_tpdusize */
-
- 0, /* 4 bits p_ack_strat */
- 0, /* 4 bits p_rx_strat*/
- TP_CLASS_0, /* 5 bits p_class */
- 0, /* 1 bit xtd format */
- 0, /* 1 bit xpd service */
- 0, /* 1 bit use_checksum */
- 0, /* 1 bit use net xpd */
- 0, /* 1 bit use rcc */
- 0, /* 1 bit use efc */
- 0, /* no disc indications */
- 0, /* don't change params */
- ISO_CONS, /* p_netservice */
+ TP0_TPDUSIZE, /* 8 bits p_tpdusize */
+
+ 0, /* 4 bits p_ack_strat */
+ 0, /* 4 bits p_rx_strat */
+ TP_CLASS_0, /* 5 bits p_class */
+ 0, /* 1 bit xtd format */
+ 0, /* 1 bit xpd service */
+ 0, /* 1 bit use_checksum */
+ 0, /* 1 bit use net xpd */
+ 0, /* 1 bit use rcc */
+ 0, /* 1 bit use efc */
+ 0, /* no disc indications */
+ 0, /* don't change params */
+ ISO_CONS, /* p_netservice */
},
/* ISO_COSNS: TP4 CONNECTION LESS SERVICE over CONSNS */
{
- TP_NRETRANS, /* short p_Nretrans; */
- 40, /* 20 sec */ /* short p_dr_ticks; */
+ TP_NRETRANS, /* short p_Nretrans; */
+ 40, /* 20 sec *//* short p_dr_ticks; */
- 40, /* 20 sec */ /* short p_cc_ticks; */
- 80, /* 40 sec */ /* short p_dt_ticks; */
+ 40, /* 20 sec *//* short p_cc_ticks; */
+ 80, /* 40 sec *//* short p_dt_ticks; */
- 120, /* 1 min */ /* short p_x_ticks; */
- 360, /* 3 min */ /* short p_cr_ticks;*/
+ 120, /* 1 min *//* short p_x_ticks; */
+ 360, /* 3 min *//* short p_cr_ticks; */
- 360, /* 3 min */ /* short p_keepalive_ticks;*/
- 20, /* 10 sec */ /* short p_sendack_ticks; */
+ 360, /* 3 min *//* short p_keepalive_ticks; */
+ 20, /* 10 sec *//* short p_sendack_ticks; */
- 600, /* 5 min */ /* short p_ref_ticks; */
- 480, /* 4 min */ /* short p_inact_ticks; */
+ 600, /* 5 min *//* short p_ref_ticks; */
+ 480, /* 4 min *//* short p_inact_ticks; */
- (short) 100, /* short p_lcdtfract */
+ (short) 100, /* short p_lcdtfract */
(short) TP0_SOCKBUFSIZE, /* short p_winsize */
- TP0_TPDUSIZE, /* u_char p_tpdusize */
-
- TPACK_WINDOW, /* 4 bits p_ack_strat */
- TPRX_USE_CW , /* No fast start */
- /* 4 bits p_rx_strat*/
- TP_CLASS_4 | TP_CLASS_0,/* 5 bits p_class */
- 0, /* 1 bit xtd format */
- 1, /* 1 bit xpd service */
- 1, /* 1 bit use_checksum */
- 0, /* 1 bit use net xpd */
- 0, /* 1 bit use rcc */
- 0, /* 1 bit use efc */
- 0, /* no disc indications */
- 0, /* don't change params */
- ISO_COSNS, /* p_netservice */
+ TP0_TPDUSIZE, /* u_char p_tpdusize */
+
+ TPACK_WINDOW, /* 4 bits p_ack_strat */
+ TPRX_USE_CW, /* No fast start */
+ /* 4 bits p_rx_strat */
+ TP_CLASS_4 | TP_CLASS_0, /* 5 bits p_class */
+ 0, /* 1 bit xtd format */
+ 1, /* 1 bit xpd service */
+ 1, /* 1 bit use_checksum */
+ 0, /* 1 bit use net xpd */
+ 0, /* 1 bit use rcc */
+ 0, /* 1 bit use efc */
+ 0, /* no disc indications */
+ 0, /* don't change params */
+ ISO_COSNS, /* p_netservice */
},
};
#ifdef INET
-int in_putnetaddr();
-int in_getnetaddr();
-int in_cmpnetaddr();
-int in_putsufx();
-int in_getsufx();
-int in_recycle_tsuffix();
-int tpip_mtu();
-int in_pcbbind();
-int in_pcbconnect();
-int in_pcbdisconnect();
-int in_pcbdetach();
-int in_pcballoc();
-int tpip_output();
-int tpip_output_dg();
-struct inpcbtable tp_inpcb;
-#endif /* INET */
+struct inpcbtable tp_inpcb;
+#endif /* INET */
#ifdef ISO
-int iso_putnetaddr();
-int iso_getnetaddr();
-int iso_cmpnetaddr();
-int iso_putsufx();
-int iso_getsufx();
-int iso_recycle_tsuffix();
-int tpclnp_mtu();
-int iso_pcbbind();
-int iso_pcbconnect();
-int iso_pcbdisconnect();
-int iso_pcbdetach();
-int iso_pcballoc();
-int tpclnp_output();
-int tpclnp_output_dg();
-int iso_nlctloutput();
-struct isopcb tp_isopcb;
-#endif /* ISO */
+struct isopcb tp_isopcb;
+#endif /* ISO */
#ifdef TPCONS
-int iso_putnetaddr();
-int iso_getnetaddr();
-int iso_cmpnetaddr();
-int iso_putsufx();
-int iso_getsufx();
-int iso_recycle_tsuffix();
-int iso_pcbbind();
-int tpcons_pcbconnect();
-int tpclnp_mtu();
-int iso_pcbdisconnect();
-int iso_pcbdetach();
-int iso_pcballoc();
-int tpcons_output();
-struct isopcb tp_isopcb;
-#endif /* TPCONS */
+struct isopcb tp_isopcb;
+#endif /* TPCONS */
struct nl_protosw nl_protosw[] = {
/* ISO_CLNS */
#ifdef ISO
- { AF_ISO, iso_putnetaddr, iso_getnetaddr, iso_cmpnetaddr,
+ {AF_ISO, iso_putnetaddr, iso_getnetaddr, iso_cmpnetaddr,
iso_putsufx, iso_getsufx,
iso_recycle_tsuffix,
tpclnp_mtu, iso_pcbbind, iso_pcbconnect,
- iso_pcbdisconnect, iso_pcbdetach,
+ iso_pcbdisconnect, iso_pcbdetach,
iso_pcballoc,
tpclnp_output, tpclnp_output_dg, iso_nlctloutput,
- (caddr_t) &tp_isopcb,
- },
+ (caddr_t) & tp_isopcb,
+ },
#else
- { 0 },
-#endif /* ISO */
+ {0},
+#endif /* ISO */
/* IN_CLNS */
#ifdef INET
- { AF_INET, in_putnetaddr, in_getnetaddr, in_cmpnetaddr,
+ {AF_INET, in_putnetaddr, in_getnetaddr, in_cmpnetaddr,
in_putsufx, in_getsufx,
in_recycle_tsuffix,
tpip_mtu, in_pcbbind, in_pcbconnect,
- in_pcbdisconnect, in_pcbdetach,
+ in_pcbdisconnect, in_pcbdetach,
in_pcballoc,
tpip_output, tpip_output_dg, /* nl_ctloutput */ NULL,
- (caddr_t) &tp_inpcb,
- },
+ (caddr_t) & tp_inpcb,
+ },
#else
- { 0 },
-#endif /* INET */
+ {0},
+#endif /* INET */
/* ISO_CONS */
#if defined(ISO) && defined(TPCONS)
- { AF_ISO, iso_putnetaddr, iso_getnetaddr, iso_cmpnetaddr,
+ {AF_ISO, iso_putnetaddr, iso_getnetaddr, iso_cmpnetaddr,
iso_putsufx, iso_getsufx,
iso_recycle_tsuffix,
tpclnp_mtu, iso_pcbbind, tpcons_pcbconnect,
- iso_pcbdisconnect, iso_pcbdetach,
+ iso_pcbdisconnect, iso_pcbdetach,
iso_pcballoc,
tpcons_output, tpcons_output, iso_nlctloutput,
- (caddr_t) &tp_isopcb,
- },
+ (caddr_t) & tp_isopcb,
+ },
#else
- { 0 },
-#endif /* ISO_CONS */
+ {0},
+#endif /* ISO_CONS */
/* End of protosw marker */
- { 0 }
+ {0}
};
-u_long tp_sendspace = 1024 * 4;
-u_long tp_recvspace = 1024 * 4;
+u_long tp_sendspace = 1024 * 4;
+u_long tp_recvspace = 1024 * 4;
/*
* NAME: tp_init()
* RETURNS: Nada
*
* SIDE EFFECTS:
- *
+ *
* NOTES:
*/
void
tp_init()
{
- static int init_done=0;
- void tp_timerinit();
+ static int init_done = 0;
if (init_done++)
return;
/* FOR INET */
- in_pcbinit(&tp_inpcb);
+ in_pcbinit(&tp_inpcb, 1);
/* FOR ISO */
tp_isopcb.isop_next = tp_isopcb.isop_prev = &tp_isopcb;
- tp_start_win = 2;
+ tp_start_win = 2;
tp_timerinit();
- bzero((caddr_t)&tp_stat, sizeof(struct tp_stat));
+ bzero((caddr_t) & tp_stat, sizeof(struct tp_stat));
}
/*
{
soisdisconnecting(so);
so->so_state &= ~SS_CANTSENDMORE;
- IFPERF(sototpcb(so))
+#ifdef TP_PERF_MEAS
+ if (DOPERF(sototpcb(so))) {
register struct tp_pcb *tpcb = sototpcb(so);
- u_int fsufx, lsufx;
+ u_int fsufx, lsufx;
- bcopy ((caddr_t)tpcb->tp_fsuffix, (caddr_t)&fsufx, sizeof(u_int) );
- bcopy ((caddr_t)tpcb->tp_lsuffix, (caddr_t)&lsufx, sizeof(u_int) );
+ bcopy((caddr_t) tpcb->tp_fsuffix, (caddr_t) &fsufx,
+ sizeof(u_int));
+ bcopy((caddr_t) tpcb->tp_lsuffix, (caddr_t) &lsufx,
+ sizeof(u_int));
- tpmeas(tpcb->tp_lref, TPtime_close, &time, fsufx, lsufx, tpcb->tp_fref);
- tpcb->tp_perf_on = 0; /* turn perf off */
- ENDPERF
+ tpmeas(tpcb->tp_lref, TPtime_close, &time, fsufx, lsufx,
+ tpcb->tp_fref);
+ tpcb->tp_perf_on = 0; /* turn perf off */
+ }
+#endif
}
* NAME: tp_soisdisconnected()
*
* CALLED FROM:
- * tp.trans
+ * tp.trans
*
* FUNCTION and ARGUMENTS:
* Set state of the socket (so) to reflect that fact that we're disconnectED
*/
void
tp_soisdisconnected(tpcb)
- register struct tp_pcb *tpcb;
+ register struct tp_pcb *tpcb;
{
- register struct socket *so = tpcb->tp_sock;
+ register struct socket *so = tpcb->tp_sock;
soisdisconnecting(so);
so->so_state &= ~SS_CANTSENDMORE;
- IFPERF(tpcb)
+#ifdef TP_PERF_MEAS
+ if (DOPERF(tpcb)) {
register struct tp_pcb *ttpcb = sototpcb(so);
- u_int fsufx, lsufx;
+ u_int fsufx, lsufx;
/* CHOKE */
- bcopy ((caddr_t)ttpcb->tp_fsuffix, (caddr_t)&fsufx, sizeof(u_int) );
- bcopy ((caddr_t)ttpcb->tp_lsuffix, (caddr_t)&lsufx, sizeof(u_int) );
-
- tpmeas(ttpcb->tp_lref, TPtime_close,
- &time, &lsufx, &fsufx, ttpcb->tp_fref);
- tpcb->tp_perf_on = 0; /* turn perf off */
- ENDPERF
+ bcopy((caddr_t) ttpcb->tp_fsuffix, (caddr_t) &fsufx,
+ sizeof(u_int));
+ bcopy((caddr_t) ttpcb->tp_lsuffix, (caddr_t) &lsufx,
+ sizeof(u_int));
+
+ tpmeas(ttpcb->tp_lref, TPtime_close,
+ &time, &lsufx, &fsufx, ttpcb->tp_fref);
+ tpcb->tp_perf_on = 0; /* turn perf off */
+ }
+#endif
tpcb->tp_refstate = REF_FROZEN;
tp_recycle_tsuffix(tpcb);
- tp_etimeout(tpcb, TM_reference, (int)tpcb->tp_refer_ticks);
+ tp_etimeout(tpcb, TM_reference, (int) tpcb->tp_refer_ticks);
}
/*
* Frees the reference represented by (r) for re-use.
*
* RETURNS: Nothing
- *
+ *
* SIDE EFFECTS:
*
* NOTES: better be called at clock priority !!!!!
*/
void
tp_freeref(n)
-RefNum n;
+ RefNum n;
{
register struct tp_ref *r = tp_ref + n;
register struct tp_pcb *tpcb;
tpcb = r->tpr_pcb;
- IFDEBUG(D_TIMER)
- printf("tp_freeref called for ref %d pcb %x maxrefopen %d\n",
- n, tpcb, tp_refinfo.tpr_maxopen);
- ENDDEBUG
- IFTRACE(D_TIMER)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TIMER]) {
+ printf("tp_freeref called for ref %d pcb %x maxrefopen %d\n",
+ n, tpcb, tp_refinfo.tpr_maxopen);
+ }
+#endif
+#ifdef TPPT
+ if (tp_traceflags[D_TIMER]) {
tptrace(TPPTmisc, "tp_freeref ref maxrefopen pcb",
- n, tp_refinfo.tpr_maxopen, tpcb, 0);
- ENDTRACE
+ n, tp_refinfo.tpr_maxopen, tpcb, 0);
+ }
+#endif
if (tpcb == 0)
return;
- IFDEBUG(D_CONN)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
printf("tp_freeref: CLEARING tpr_pcb 0x%x\n", tpcb);
- ENDDEBUG
- r->tpr_pcb = (struct tp_pcb *)0;
+ }
+#endif
+ r->tpr_pcb = (struct tp_pcb *) 0;
tpcb->tp_refstate = REF_FREE;
for (r = tp_ref + tp_refinfo.tpr_maxopen; r > tp_ref; r--)
tp_refinfo.tpr_maxopen = r - tp_ref;
tp_refinfo.tpr_numopen--;
- IFDEBUG(D_TIMER)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TIMER]) {
printf("tp_freeref ends w/ maxrefopen %d\n", tp_refinfo.tpr_maxopen);
- ENDDEBUG
+ }
+#endif
}
/*
*
* FUNCTION and ARGUMENTS:
* obtains the next free reference and allocates the appropriate
- * ref structure, links that structure to (tpcb)
+ * ref structure, links that structure to (tpcb)
*
* RETURN VALUE:
* a reference number
* NOTES:
*/
u_long
-tp_getref(tpcb)
+tp_getref(tpcb)
register struct tp_pcb *tpcb;
{
- register struct tp_ref *r, *rlim;
- register int i;
- caddr_t obase;
- unsigned size;
+ register struct tp_ref *r, *rlim;
+ register int i;
+ caddr_t obase;
+ unsigned size;
if (++tp_refinfo.tpr_numopen < tp_refinfo.tpr_size)
for (r = tp_refinfo.tpr_base, rlim = r + tp_refinfo.tpr_size;
- ++r < rlim; ) /* tp_ref[0] is never used */
+ ++r < rlim;) /* tp_ref[0] is never used */
if (r->tpr_pcb == 0)
goto got_one;
/* else have to allocate more space */
- obase = (caddr_t)tp_refinfo.tpr_base;
+ obase = (caddr_t) tp_refinfo.tpr_base;
size = tp_refinfo.tpr_size * sizeof(struct tp_ref);
r = (struct tp_ref *) malloc(size + size, M_PCB, M_NOWAIT);
if (r == 0)
return (--tp_refinfo.tpr_numopen, TP_ENOREF);
tp_refinfo.tpr_base = tp_ref = r;
tp_refinfo.tpr_size *= 2;
- bcopy(obase, (caddr_t)r, size);
+ bcopy(obase, (caddr_t) r, size);
free(obase, M_PCB);
- r = (struct tp_ref *)(size + (caddr_t)r);
- bzero((caddr_t)r, size);
+ r = (struct tp_ref *) (size + (caddr_t) r);
+ bzero((caddr_t) r, size);
got_one:
r->tpr_pcb = tpcb;
tpcb->tp_refstate = REF_OPENING;
i = r - tp_refinfo.tpr_base;
- if (tp_refinfo.tpr_maxopen < i)
+ if (tp_refinfo.tpr_maxopen < i)
tp_refinfo.tpr_maxopen = i;
- return (u_long)i;
+ return (u_long) i;
}
/*
* given a tpcb, allocate an appropriate lower-lever npcb, freeing
* any old ones that might need re-assigning.
*/
+int
tp_set_npcb(tpcb)
-register struct tp_pcb *tpcb;
+ register struct tp_pcb *tpcb;
{
register struct socket *so = tpcb->tp_sock;
- int error;
+ int error;
if (tpcb->tp_nlproto && tpcb->tp_npcb) {
- short so_state = so->so_state;
+ short so_state = so->so_state;
so->so_state &= ~SS_NOFDREF;
- tpcb->tp_nlproto->nlp_pcbdetach(tpcb->tp_npcb);
+ (*tpcb->tp_nlproto->nlp_pcbdetach)(tpcb->tp_npcb);
so->so_state = so_state;
}
tpcb->tp_nlproto = &nl_protosw[tpcb->tp_netservice];
/* xx_pcballoc sets so_pcb */
- error = tpcb->tp_nlproto->nlp_pcballoc(so, tpcb->tp_nlproto->nlp_pcblist);
+ error = (*tpcb->tp_nlproto->nlp_pcballoc)(so,
+ tpcb->tp_nlproto->nlp_pcblist);
tpcb->tp_npcb = so->so_pcb;
so->so_pcb = tpcb;
return (error);
*
* NOTES:
*/
+int
tp_attach(so, protocol)
- struct socket *so;
- long protocol;
+ struct socket *so;
+ long protocol;
{
- register struct tp_pcb *tpcb;
- int error = 0;
- int dom = so->so_proto->pr_domain->dom_family;
- u_long lref;
+ register struct tp_pcb *tpcb;
+ int error = 0;
+ int dom = so->so_proto->pr_domain->dom_family;
+ u_long lref;
extern struct tp_conn_param tp_conn_param[];
- IFDEBUG(D_CONN)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
printf("tp_attach:dom 0x%x so 0x%x ", dom, so);
- ENDDEBUG
- IFTRACE(D_CONN)
+ }
+#endif
+#ifdef TPPT
+ if (tp_traceflags[D_CONN]) {
tptrace(TPPTmisc, "tp_attach:dom so", dom, so, 0, 0);
- ENDTRACE
-
- if (so->so_pcb != 0) {
- return EISCONN; /* socket already part of a connection*/
}
+#endif
+ if (so->so_pcb != NULL) {
+ return EISCONN; /* socket already part of a connection */
+ }
if (so->so_snd.sb_hiwat == 0 || so->so_rcv.sb_hiwat == 0)
error = soreserve(so, tp_sendspace, tp_recvspace);
- /* later an ioctl will allow reallocation IF still in closed state */
+ /* later an ioctl will allow reallocation IF still in closed state */
if (error)
goto bad2;
error = ENOBUFS;
goto bad2;
}
- bzero( (caddr_t)tpcb, sizeof (struct tp_pcb) );
+ bzero((caddr_t) tpcb, sizeof(struct tp_pcb));
- if ( ((lref = tp_getref(tpcb)) & TP_ENOREF) != 0 ) {
- error = ETOOMANYREFS;
+ if (((lref = tp_getref(tpcb)) & TP_ENOREF) != 0) {
+ error = ETOOMANYREFS;
goto bad3;
}
tpcb->tp_lref = lref;
- tpcb->tp_sock = so;
+ tpcb->tp_sock = so;
tpcb->tp_domain = dom;
tpcb->tp_rhiwat = so->so_rcv.sb_hiwat;
/* tpcb->tp_proto = protocol; someday maybe? */
- if (protocol && protocol<ISOPROTO_TP4) {
+ if (protocol && protocol < ISOPROTO_TP4) {
tpcb->tp_netservice = ISO_CONS;
- tpcb->tp_snduna = (SeqNum) -1;/* kludge so the pseudo-ack from the CR/CC
- * will generate correct fake-ack values
- */
+ tpcb->tp_snduna = (SeqNum) - 1; /* kludge so the pseudo-ack
+ * from the CR/CC will
+ * generate correct fake-ack
+ * values */
} else {
- tpcb->tp_netservice = (dom== AF_INET)?IN_CLNS:ISO_CLNS;
+ tpcb->tp_netservice = (dom == AF_INET) ? IN_CLNS : ISO_CLNS;
/* the default */
}
tpcb->_tp_param = tp_conn_param[tpcb->tp_netservice];
tpcb->tp_state = TP_CLOSED;
- tpcb->tp_vers = TP_VERSION;
+ tpcb->tp_vers = TP_VERSION;
tpcb->tp_notdetached = 1;
- /* Spec says default is 128 octets,
- * that is, if the tpdusize argument never appears, use 128.
- * As the initiator, we will always "propose" the 2048
- * size, that is, we will put this argument in the CR
- * always, but accept what the other side sends on the CC.
- * If the initiator sends us something larger on a CR,
- * we'll respond w/ this.
- * Our maximum is 4096. See tp_chksum.c comments.
- */
- tpcb->tp_cong_win =
+ /*
+ * Spec says default is 128 octets, that is, if the tpdusize argument
+ * never appears, use 128. As the initiator, we will always "propose"
+ * the 2048 size, that is, we will put this argument in the CR
+ * always, but accept what the other side sends on the CC. If the
+ * initiator sends us something larger on a CR, we'll respond w/
+ * this. Our maximum is 4096. See tp_chksum.c comments.
+ */
+ tpcb->tp_cong_win =
tpcb->tp_l_tpdusize = 1 << tpcb->tp_tpdusize;
- tpcb->tp_seqmask = TP_NML_FMT_MASK;
- tpcb->tp_seqbit = TP_NML_FMT_BIT;
- tpcb->tp_seqhalf = tpcb->tp_seqbit >> 1;
+ tpcb->tp_seqmask = TP_NML_FMT_MASK;
+ tpcb->tp_seqbit = TP_NML_FMT_BIT;
+ tpcb->tp_seqhalf = tpcb->tp_seqbit >> 1;
/* attach to a network-layer protoswitch */
- if ( error = tp_set_npcb(tpcb))
+ if ((error = tp_set_npcb(tpcb)) != 0)
goto bad4;
- ASSERT( tpcb->tp_nlproto->nlp_afamily == tpcb->tp_domain);
+ ASSERT(tpcb->tp_nlproto->nlp_afamily == tpcb->tp_domain);
/* nothing to do for iso case */
- if( dom == AF_INET )
+ if (dom == AF_INET)
sotoinpcb(so)->inp_ppcb = (caddr_t) tpcb;
return 0;
bad4:
- IFDEBUG(D_CONN)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
printf("BAD4 in tp_attach, so 0x%x\n", so);
- ENDDEBUG
+ }
+#endif
tp_freeref(tpcb->tp_lref);
bad3:
- IFDEBUG(D_CONN)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
printf("BAD3 in tp_attach, so 0x%x\n", so);
- ENDDEBUG
+ }
+#endif
- free((caddr_t)tpcb, M_PCB); /* never a cluster */
+ free((caddr_t) tpcb, M_PCB); /* never a cluster */
bad2:
- IFDEBUG(D_CONN)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
printf("BAD2 in tp_attach, so 0x%x\n", so);
- ENDDEBUG
+ }
+#endif
so->so_pcb = 0;
-/*bad:*/
- IFDEBUG(D_CONN)
+ /* bad: */
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
printf("BAD in tp_attach, so 0x%x\n", so);
- ENDDEBUG
+ }
+#endif
return error;
}
* CALLED FROM:
* tp.trans, on behalf of a user close request
* and when the reference timer goes off
- * (if the disconnect was initiated by the protocol entity
+ * (if the disconnect was initiated by the protocol entity
* rather than by the user)
*
* FUNCTION and ARGUMENTS:
*/
void
tp_detach(tpcb)
- register struct tp_pcb *tpcb;
+ register struct tp_pcb *tpcb;
{
- void tp_freeref(), tp_rsyflush();
- register struct socket *so = tpcb->tp_sock;
+ register struct socket *so = tpcb->tp_sock;
- IFDEBUG(D_CONN)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
printf("tp_detach(tpcb 0x%x, so 0x%x)\n",
- tpcb,so);
- ENDDEBUG
- IFTRACE(D_CONN)
- tptraceTPCB(TPPTmisc, "tp_detach tpcb so lsufx",
- tpcb, so, *(u_short *)(tpcb->tp_lsuffix), 0);
- ENDTRACE
-
- IFDEBUG(D_CONN)
+ tpcb, so);
+ }
+#endif
+#ifdef TPPT
+ if (tp_traceflags[D_CONN]) {
+ tptraceTPCB(TPPTmisc, "tp_detach tpcb so lsufx",
+ tpcb, so, *(u_short *) (tpcb->tp_lsuffix), 0);
+ }
+#endif
+
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
printf("so_snd at 0x%x so_rcv at 0x%x\n", &so->so_snd, &so->so_rcv);
dump_mbuf(so->so_snd.sb_mb, "so_snd at detach ");
printf("about to call LL detach, nlproto 0x%x, nl_detach 0x%x\n",
- tpcb->tp_nlproto, tpcb->tp_nlproto->nlp_pcbdetach);
- ENDDEBUG
+ tpcb->tp_nlproto, tpcb->tp_nlproto->nlp_pcbdetach);
+ }
+#endif
if (tpcb->tp_Xsnd.sb_mb) {
printf("Unsent Xdata on detach; would panic");
if (tpcb->tp_ucddata)
m_freem(tpcb->tp_ucddata);
- IFDEBUG(D_CONN)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
printf("reassembly info cnt %d rsyq 0x%x\n",
- tpcb->tp_rsycnt, tpcb->tp_rsyq);
- ENDDEBUG
+ tpcb->tp_rsycnt, tpcb->tp_rsyq);
+ }
+#endif
if (tpcb->tp_rsyq)
tp_rsyflush(tpcb);
}
tpcb->tp_notdetached = 0;
- IFDEBUG(D_CONN)
- printf("calling (...nlproto->...)(0x%x, so 0x%x)\n",
- tpcb->tp_npcb, so);
- printf("so 0x%x so_head 0x%x, qlen %d q0len %d qlimit %d\n",
- so, so->so_head,
- so->so_q0len, so->so_qlen, so->so_qlimit);
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
+ printf("calling (...nlproto->...)(0x%x, so 0x%x)\n",
+ tpcb->tp_npcb, so);
+ printf("so 0x%x so_head 0x%x, qlen %d q0len %d qlimit %d\n",
+ so, so->so_head,
+ so->so_q0len, so->so_qlen, so->so_qlimit);
+ }
+#endif
- (tpcb->tp_nlproto->nlp_pcbdetach)(tpcb->tp_npcb);
- /* does an so->so_pcb = 0; sofree(so) */
+ (*tpcb->tp_nlproto->nlp_pcbdetach)(tpcb->tp_npcb);
+ /* does an so->so_pcb = 0; sofree(so) */
- IFDEBUG(D_CONN)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
printf("after xxx_pcbdetach\n");
- ENDDEBUG
+ }
+#endif
if (tpcb->tp_state == TP_LISTENING) {
register struct tp_pcb **tt;
else
printf("tp_detach from listen: should panic\n");
}
- if (tpcb->tp_refstate == REF_OPENING ) {
- /* no connection existed here so no reference timer will be called */
- IFDEBUG(D_CONN)
+ if (tpcb->tp_refstate == REF_OPENING) {
+ /*
+ * no connection existed here so no reference timer will be
+ * called
+ */
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
printf("SETTING ref %d to REF_FREE\n", tpcb->tp_lref);
- ENDDEBUG
+ }
+#endif
tp_freeref(tpcb->tp_lref);
}
#ifdef TP_PERF_MEAS
- /*
- * Get rid of the cluster mbuf allocated for performance measurements, if
- * there is one. Note that tpcb->tp_perf_on says nothing about whether or
- * not a cluster mbuf was allocated, so you have to check for a pointer
- * to one (that is, we need the TP_PERF_MEASs around the following section
- * of code, not the IFPERFs)
+ /*
+ * Get rid of the cluster mbuf allocated for performance
+ * measurements, if there is one. Note that tpcb->tp_perf_on says
+ * nothing about whether or not a cluster mbuf was allocated, so you
+ * have to check for a pointer to one (that is, we need the
+ * TP_PERF_MEASs around the following section of code, not the
+ * IFPERFs)
*/
if (tpcb->tp_p_meas) {
- IFDEBUG(D_PERF_MEAS)
+ register struct mbuf *m = tpcb->tp_p_mbuf;
+ struct mbuf *n;
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_PERF_MEAS]) {
printf("freeing tp_p_meas 0x%x ", tpcb->tp_p_meas);
- ENDDEBUG
+ }
+#endif
free(tpcb->tp_p_meas, M_PCB);
tpcb->tp_p_meas = 0;
}
-#endif /* TP_PERF_MEAS */
+#endif /* TP_PERF_MEAS */
- IFDEBUG(D_CONN)
- printf( "end of detach, NOT single, tpcb 0x%x\n", tpcb);
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
+ printf("end of detach, NOT single, tpcb 0x%x\n", tpcb);
+ }
+#endif
/* free((caddr_t)tpcb, M_PCB); WHere to put this ? */
}
struct que {
- struct tp_pcb *next;
- struct tp_pcb *prev;
-} tp_bound_pcbs =
-{(struct tp_pcb *)&tp_bound_pcbs, (struct tp_pcb *)&tp_bound_pcbs};
+ struct tp_pcb *next;
+ struct tp_pcb *prev;
+} tp_bound_pcbs =
+{
+ (struct tp_pcb *) & tp_bound_pcbs, (struct tp_pcb *) & tp_bound_pcbs
+};
-u_short tp_unique;
+u_short tp_unique;
+int
tp_tselinuse(tlen, tsel, siso, reuseaddr)
-caddr_t tsel;
-register struct sockaddr_iso *siso;
+ int tlen;
+ caddr_t tsel;
+ register struct sockaddr_iso *siso;
+ int reuseaddr;
{
- struct tp_pcb *b = tp_bound_pcbs.next, *l = tp_listeners;
+ struct tp_pcb *b = tp_bound_pcbs.next, *l = tp_listeners;
register struct tp_pcb *t;
for (;;) {
- if (b != (struct tp_pcb *)&tp_bound_pcbs) {
- t = b; b = t->tp_next;
+ if (b != (struct tp_pcb *) & tp_bound_pcbs) {
+ t = b;
+ b = t->tp_next;
} else if (l) {
- t = l; l = t->tp_nextlisten;
+ t = l;
+ l = t->tp_nextlisten;
} else
break;
if (tlen == t->tp_lsuffixlen && bcmp(tsel, t->tp_lsuffix, tlen) == 0) {
return 1;
} else if (siso) {
if (siso->siso_family == t->tp_domain &&
- t->tp_nlproto->nlp_cmpnetaddr(t->tp_npcb, siso, TP_LOCAL))
- return 1;
+ (*t->tp_nlproto->nlp_cmpnetaddr)(t->tp_npcb,
+ (struct sockaddr *) siso, TP_LOCAL))
+ return 1;
} else if (reuseaddr == 0)
- return 1;
+ return 1;
}
}
return 0;
}
-tp_pcbbind(tpcb, nam)
-register struct tp_pcb *tpcb;
-register struct mbuf *nam;
+int
+tp_pcbbind(v, nam)
+ register void *v;
+ register struct mbuf *nam;
{
+ register struct tp_pcb *tpcb = v;
register struct sockaddr_iso *siso = 0;
- int tlen = 0, wrapped = 0;
- caddr_t tsel;
- u_short tutil;
+ int tlen = 0, wrapped = 0;
+ caddr_t tsel = NULL;
+ u_short tutil;
if (tpcb->tp_state != TP_CLOSED)
return (EINVAL);
#endif
#ifdef INET
case AF_INET:
- tsel = (caddr_t)&tutil;
- if (tutil = satosin(siso)->sin_port)
+ tsel = (caddr_t) & tutil;
+ if ((tutil = satosin(siso)->sin_port) != 0)
tlen = 2;
if (satosin(siso)->sin_addr.s_addr == 0)
siso = 0;
if (tpcb->tp_lsuffixlen == 0) {
if (tlen) {
if (tp_tselinuse(tlen, tsel, siso,
- tpcb->tp_sock->so_options & SO_REUSEADDR))
+ tpcb->tp_sock->so_options & SO_REUSEADDR))
return (EINVAL);
} else {
- for (tsel = (caddr_t)&tutil, tlen = 2;;){
+ for (tsel = (caddr_t) & tutil, tlen = 2;;) {
if (tp_unique++ < ISO_PORT_RESERVED ||
- tp_unique > ISO_PORT_USERRESERVED) {
- if (wrapped++)
- return ESRCH;
- tp_unique = ISO_PORT_RESERVED;
+ tp_unique > ISO_PORT_USERRESERVED) {
+ if (wrapped++)
+ return ESRCH;
+ tp_unique = ISO_PORT_RESERVED;
}
tutil = htons(tp_unique);
if (tp_tselinuse(tlen, tsel, siso, 0) == 0)
break;
}
- if (siso) switch (siso->siso_family) {
+ if (siso)
+ switch (siso->siso_family) {
#ifdef ISO
case AF_ISO:
bcopy(tsel, TSEL(siso), tlen);
tpcb->tp_flags |= TPF_GENERAL_ADDR;
return (0);
}
- return tpcb->tp_nlproto->nlp_pcbbind(tpcb->tp_npcb, nam);
+ return (*tpcb->tp_nlproto->nlp_pcbbind)(tpcb->tp_npcb, nam);
}
-/* $NetBSD: tp_pcb.h,v 1.8 1995/08/16 00:38:57 mycroft Exp $ */
+/* $OpenBSD: tp_pcb.h,v 1.2 1996/03/04 10:36:20 mickey Exp $ */
+/* $NetBSD: tp_pcb.h,v 1.9 1996/02/13 22:11:44 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
/***********************************************************
Copyright IBM Corporation 1987
- All Rights Reserved
+ All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
/*
* ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison
*/
-/*
- * This file defines the transport protocol control block (tpcb).
- * and a bunch of #define values that are used in the tpcb.
+/*
+ * This file defines the transport protocol control block (tpcb). and a bunch
+ * of #define values that are used in the tpcb.
*/
-#ifndef _NETISO_TP_PCB_H_
-#define _NETISO_TP_PCB_H_
+#ifndef _NETISO_TP_PCB_H_
+#define _NETISO_TP_PCB_H_
#include <netiso/tp_param.h>
#include <netiso/tp_timer.h>
#include <netiso/tp_user.h>
#ifndef sblock
#include <sys/socketvar.h>
-#endif /* sblock */
+#endif /* sblock */
-/* NOTE: the code depends on REF_CLOSED > REF_OPEN > the rest, and
- * on REF_FREE being zero
- *
- * Possible improvement:
- * think about merging the tp_ref w/ the tpcb and doing a search
- * through the tpcb list, from tpb. This would slow down lookup
- * during data transfer
- * It would be a little nicer also to have something based on the
- * clock (like top n bits of the reference is part of the clock, to
- * minimize the likelihood of reuse after a crash)
- * also, need to keep the timer servicing part to a minimum (although
- * the cost of this is probably independent of whether the timers are
- * in the pcb or in an array..
- * Last, would have to make the number of timers a function of the amount of
- * mbufs available, plus some for the frozen references.
- *
- * Possible improvement:
- * Might not need the ref_state stuff either...
- * REF_FREE could correspond to tp_state == CLOSED or nonexistend tpcb,
- * REF_OPEN to tp_state anywhere from AK_WAIT or CR_SENT to CLOSING
- * REF_OPENING could correspond to LISTENING, because that's the
- * way it's used, not because the correspondence is exact.
- * REF_CLOSED could correspond to REFWAIT
+/*
+ * NOTE: the code depends on REF_CLOSED > REF_OPEN > the rest, and on
+ * REF_FREE being zero
+ *
+ * Possible improvement: think about merging the tp_ref w/ the tpcb and doing a
+ * search through the tpcb list, from tpb. This would slow down lookup during
+ * data transfer It would be a little nicer also to have something based on
+ * the clock (like top n bits of the reference is part of the clock, to
+ * minimize the likelihood of reuse after a crash) also, need to keep the
+ * timer servicing part to a minimum (although the cost of this is probably
+ * independent of whether the timers are in the pcb or in an array.. Last,
+ * would have to make the number of timers a function of the amount of mbufs
+ * available, plus some for the frozen references.
+ *
+ * Possible improvement: Might not need the ref_state stuff either... REF_FREE
+ * could correspond to tp_state == CLOSED or nonexistend tpcb, REF_OPEN to
+ * tp_state anywhere from AK_WAIT or CR_SENT to CLOSING REF_OPENING could
+ * correspond to LISTENING, because that's the way it's used, not because the
+ * correspondence is exact. REF_CLOSED could correspond to REFWAIT
*/
-#define REF_FROZEN 3 /* has ref timer only */
+#define REF_FROZEN 3 /* has ref timer only */
#define REF_OPEN 2 /* has timers, possibly active */
-#define REF_OPENING 1 /* in use (has a pcb) but no timers */
+#define REF_OPENING 1 /* in use (has a pcb) but no timers */
#define REF_FREE 0 /* free to reallocate */
-#define TM_NTIMERS 6
+#define TM_NTIMERS 6
+struct iso_addr;
+struct sockaddr;
+struct socket;
+struct tp_pcb;
+struct inpcb;
struct tp_ref {
- struct tp_pcb *tpr_pcb; /* back ptr to PCB */
+ struct tp_pcb *tpr_pcb;/* back ptr to PCB */
};
/* PER system stuff (one static structure instead of a bunch of names) */
struct tp_refinfo {
- struct tp_ref *tpr_base;
- int tpr_size;
- int tpr_maxopen;
- int tpr_numopen;
+ struct tp_ref *tpr_base;
+ int tpr_size;
+ int tpr_maxopen;
+ int tpr_numopen;
};
struct nl_protosw {
- int nlp_afamily; /* address family */
- int (*nlp_putnetaddr)(); /* puts addresses in nl pcb */
- int (*nlp_getnetaddr)(); /* gets addresses from nl pcb */
- int (*nlp_cmpnetaddr)(); /* compares address in pcb with sockaddr */
- int (*nlp_putsufx)(); /* puts transport suffixes in nl pcb */
- int (*nlp_getsufx)(); /* gets transport suffixes from nl pcb */
- int (*nlp_recycle_suffix)();/* clears suffix from nl pcb */
- int (*nlp_mtu)(); /* figures out mtu based on nl used */
- int (*nlp_pcbbind)(); /* bind to pcb for net level */
- int (*nlp_pcbconn)(); /* connect for net level */
- int (*nlp_pcbdisc)(); /* disconnect net level */
- int (*nlp_pcbdetach)(); /* detach net level pcb */
- int (*nlp_pcballoc)(); /* allocate a net level pcb */
- int (*nlp_output)(); /* prepare a packet to give to nl */
- int (*nlp_dgoutput)(); /* prepare a packet to give to nl */
- int (*nlp_ctloutput)(); /* hook for network set/get options */
- caddr_t nlp_pcblist; /* list of xx_pcb's for connections */
+ int nlp_afamily; /* address family */
+ void (*nlp_putnetaddr) /* puts addresses in nl pcb */
+ __P((void *, struct sockaddr *, int));
+ void (*nlp_getnetaddr) /* gets addresses from nl pcb */
+ __P((void *, struct mbuf *, int));
+ int (*nlp_cmpnetaddr) /* compares address in pcb */
+ __P((void *, struct sockaddr *, int));
+ /* with sockaddr */
+ void (*nlp_putsufx) /* puts transport suffixes in */
+ __P((void *, caddr_t, int, int));
+ /* nl pcb */
+ void (*nlp_getsufx) /* gets transport suffixes */
+ __P((void *, u_short *, caddr_t, int));
+ /* from nl pcb */
+ void (*nlp_recycle_suffix) /* clears suffix from nl pcb */
+ __P((void *));
+ int (*nlp_mtu) /* figures out mtu based on */
+ __P((void *)); /* nl used */
+ int (*nlp_pcbbind) /* bind to pcb for net level */
+ __P((void *, struct mbuf *));
+ int (*nlp_pcbconn) /* connect for net level */
+ __P((void *, struct mbuf *));
+ void (*nlp_pcbdisc) /* disconnect net level */
+ __P((void *));
+ void (*nlp_pcbdetach) /* detach net level pcb */
+ __P((void *));
+ int (*nlp_pcballoc) /* allocate a net level pcb */
+ __P((struct socket *, void *));
+ int (*nlp_output) /* prepare a packet to give */
+ __P((struct mbuf *, ...)); /* to nl */
+ int (*nlp_dgoutput) /* prepare a packet to give */
+ __P((struct mbuf *, ...)); /*to nl*/
+ int (*nlp_ctloutput) /* hook for network set/get */
+ __P((int, int, caddr_t, struct mbuf *));
+ /* options */
+ caddr_t nlp_pcblist; /* list of xx_pcb's for connections */
};
struct tp_pcb {
- struct tp_pcb *tp_next;
- struct tp_pcb *tp_prev;
- struct tp_pcb *tp_nextlisten; /* chain all listeners */
- struct socket *tp_sock; /* back ptr */
- u_short tp_state; /* state of fsm */
- short tp_retrans; /* # times can still retrans */
- caddr_t tp_npcb; /* to lower layer pcb */
- struct nl_protosw *tp_nlproto; /* lower-layer dependent routines */
- struct rtentry **tp_routep; /* obtain mtu; inside npcb */
+ struct tp_pcb *tp_next;
+ struct tp_pcb *tp_prev;
+ struct tp_pcb *tp_nextlisten; /* chain all listeners */
+ struct socket *tp_sock;/* back ptr */
+ u_short tp_state; /* state of fsm */
+ short tp_retrans; /* # times can still retrans */
+ caddr_t tp_npcb;/* to lower layer pcb */
+ struct nl_protosw *tp_nlproto; /* lower-layer dependent routines */
+ struct rtentry **tp_routep; /* obtain mtu; inside npcb */
- RefNum tp_lref; /* local reference */
- RefNum tp_fref; /* foreign reference */
+ RefNum tp_lref;/* local reference */
+ RefNum tp_fref;/* foreign reference */
- u_int tp_seqmask; /* mask for seq space */
- u_int tp_seqbit; /* bit for seq number wraparound */
- u_int tp_seqhalf; /* half the seq space */
+ u_int tp_seqmask; /* mask for seq space */
+ u_int tp_seqbit; /* bit for seq number wraparound */
+ u_int tp_seqhalf; /* half the seq space */
- struct mbuf *tp_ucddata; /* user connect/disconnect data */
+ struct mbuf *tp_ucddata; /* user connect/disconnect data */
/* credit & sequencing info for SENDING */
- u_short tp_fcredit; /* current remote credit in # packets */
- u_short tp_maxfcredit; /* max remote credit in # packets */
- u_short tp_dupacks; /* intuit packet loss before rxt timo */
- u_long tp_cong_win; /* congestion window in bytes.
- * see profuse comments in TCP code
- */
- u_long tp_ssthresh; /* cong_win threshold for slow start
- * exponential to linear switch
- */
- SeqNum tp_snduna; /* seq # of lowest unacked DT */
- SeqNum tp_sndnew; /* seq # of lowest unsent DT */
- SeqNum tp_sndnum; /* next seq # to be assigned */
- SeqNum tp_sndnxt; /* what to do next; poss. rxt */
- struct mbuf *tp_sndnxt_m; /* packet corres. to sndnxt*/
- int tp_Nwindow; /* for perf. measurement */
+ u_short tp_fcredit; /* current remote credit in # packets */
+ u_short tp_maxfcredit; /* max remote credit in # packets */
+ u_short tp_dupacks; /* intuit packet loss before rxt timo */
+ u_long tp_cong_win; /* congestion window in bytes. see
+ * profuse comments in TCP code */
+ u_long tp_ssthresh; /* cong_win threshold for slow start
+ * exponential to linear switch */
+ SeqNum tp_snduna; /* seq # of lowest unacked DT */
+ SeqNum tp_sndnew; /* seq # of lowest unsent DT */
+ SeqNum tp_sndnum; /* next seq # to be assigned */
+ SeqNum tp_sndnxt; /* what to do next; poss. rxt */
+ struct mbuf *tp_sndnxt_m; /* packet corres. to sndnxt */
+ int tp_Nwindow; /* for perf. measurement */
/* credit & sequencing info for RECEIVING */
- SeqNum tp_rcvnxt; /* next DT seq # expect to recv */
- SeqNum tp_sent_lcdt; /* cdt according to last ack sent */
- SeqNum tp_sent_uwe; /* uwe according to last ack sent */
- SeqNum tp_sent_rcvnxt; /* rcvnxt according to last ack sent
- * needed for perf measurements only
- */
- u_short tp_lcredit; /* current local credit in # packets */
- u_short tp_maxlcredit; /* needed for reassembly queue */
- struct mbuf **tp_rsyq; /* unacked stuff recvd out of order */
- int tp_rsycnt; /* number of packets "" "" "" "" */
- u_long tp_rhiwat; /* remember original RCVBUF size */
-
- /* receiver congestion state stuff ... */
- u_int tp_win_recv;
+ SeqNum tp_rcvnxt; /* next DT seq # expect to recv */
+ SeqNum tp_sent_lcdt; /* cdt according to last ack sent */
+ SeqNum tp_sent_uwe; /* uwe according to last ack sent */
+ SeqNum tp_sent_rcvnxt; /* rcvnxt according to last ack sent
+ * needed for perf measurements only */
+ u_short tp_lcredit; /* current local credit in # packets */
+ u_short tp_maxlcredit; /* needed for reassembly queue */
+ struct mbuf **tp_rsyq;/* unacked stuff recvd out of order */
+ int tp_rsycnt; /* number of packets "" "" "" "" */
+ u_long tp_rhiwat; /* remember original RCVBUF size */
+
+ /* receiver congestion state stuff ... */
+ u_int tp_win_recv;
/* receive window as a scaled int (8 bit fraction part) */
struct cong_sample {
- ushort cs_size; /* current window size */
- ushort cs_received; /* PDUs received in this sample */
- ushort cs_ce_set; /* PDUs received in this sample with CE bit set */
- } tp_cong_sample;
+ ushort cs_size; /* current window size */
+ ushort cs_received; /* PDUs received in this
+ * sample */
+ ushort cs_ce_set; /* PDUs received in this
+ * sample with CE bit set */
+ } tp_cong_sample;
/* parameters per-connection controllable by user */
- struct tp_conn_param _tp_param;
-
-#define tp_Nretrans _tp_param.p_Nretrans
-#define tp_dr_ticks _tp_param.p_dr_ticks
-#define tp_cc_ticks _tp_param.p_cc_ticks
-#define tp_dt_ticks _tp_param.p_dt_ticks
-#define tp_xpd_ticks _tp_param.p_x_ticks
-#define tp_cr_ticks _tp_param.p_cr_ticks
-#define tp_keepalive_ticks _tp_param.p_keepalive_ticks
-#define tp_sendack_ticks _tp_param.p_sendack_ticks
-#define tp_refer_ticks _tp_param.p_ref_ticks
-#define tp_inact_ticks _tp_param.p_inact_ticks
-#define tp_xtd_format _tp_param.p_xtd_format
-#define tp_xpd_service _tp_param.p_xpd_service
-#define tp_ack_strat _tp_param.p_ack_strat
-#define tp_rx_strat _tp_param.p_rx_strat
-#define tp_use_checksum _tp_param.p_use_checksum
-#define tp_use_efc _tp_param.p_use_efc
-#define tp_use_nxpd _tp_param.p_use_nxpd
-#define tp_use_rcc _tp_param.p_use_rcc
-#define tp_tpdusize _tp_param.p_tpdusize
-#define tp_class _tp_param.p_class
-#define tp_winsize _tp_param.p_winsize
-#define tp_no_disc_indications _tp_param.p_no_disc_indications
-#define tp_dont_change_params _tp_param.p_dont_change_params
-#define tp_netservice _tp_param.p_netservice
-#define tp_version _tp_param.p_version
-#define tp_ptpdusize _tp_param.p_ptpdusize
-
- int tp_l_tpdusize;
- /* whereas tp_tpdusize is log2(the negotiated max size)
- * l_tpdusize is the size we'll use when sending, in # chars
- */
-
- int tp_rtv; /* max round-trip time variance */
- int tp_rtt; /* smoothed round-trip time */
- SeqNum tp_rttseq; /* packet being timed */
- int tp_rttemit; /* when emitted, in ticks */
- int tp_idle; /* last activity, in ticks */
- short tp_rxtcur; /* current retransmit value */
- short tp_rxtshift; /* log(2) of rexmt exp. backoff */
- u_char tp_cebit_off; /* real DEC bit algorithms not in use */
- u_char tp_oktonagle; /* Last unsent pckt may be append to */
- u_char tp_flags; /* values: */
-#define TPF_NLQOS_PDN TPFLAG_NLQOS_PDN
+ struct tp_conn_param _tp_param;
+
+#define tp_Nretrans _tp_param.p_Nretrans
+#define tp_dr_ticks _tp_param.p_dr_ticks
+#define tp_cc_ticks _tp_param.p_cc_ticks
+#define tp_dt_ticks _tp_param.p_dt_ticks
+#define tp_xpd_ticks _tp_param.p_x_ticks
+#define tp_cr_ticks _tp_param.p_cr_ticks
+#define tp_keepalive_ticks _tp_param.p_keepalive_ticks
+#define tp_sendack_ticks _tp_param.p_sendack_ticks
+#define tp_refer_ticks _tp_param.p_ref_ticks
+#define tp_inact_ticks _tp_param.p_inact_ticks
+#define tp_xtd_format _tp_param.p_xtd_format
+#define tp_xpd_service _tp_param.p_xpd_service
+#define tp_ack_strat _tp_param.p_ack_strat
+#define tp_rx_strat _tp_param.p_rx_strat
+#define tp_use_checksum _tp_param.p_use_checksum
+#define tp_use_efc _tp_param.p_use_efc
+#define tp_use_nxpd _tp_param.p_use_nxpd
+#define tp_use_rcc _tp_param.p_use_rcc
+#define tp_tpdusize _tp_param.p_tpdusize
+#define tp_class _tp_param.p_class
+#define tp_winsize _tp_param.p_winsize
+#define tp_no_disc_indications _tp_param.p_no_disc_indications
+#define tp_dont_change_params _tp_param.p_dont_change_params
+#define tp_netservice _tp_param.p_netservice
+#define tp_version _tp_param.p_version
+#define tp_ptpdusize _tp_param.p_ptpdusize
+
+ int tp_l_tpdusize;
+ /*
+ * whereas tp_tpdusize is log2(the negotiated max size) l_tpdusize is
+ * the size we'll use when sending, in # chars
+ */
+
+ int tp_rtv; /* max round-trip time variance */
+ int tp_rtt; /* smoothed round-trip time */
+ SeqNum tp_rttseq; /* packet being timed */
+ int tp_rttemit; /* when emitted, in ticks */
+ int tp_idle;/* last activity, in ticks */
+ short tp_rxtcur; /* current retransmit value */
+ short tp_rxtshift; /* log(2) of rexmt exp. backoff */
+ u_char tp_cebit_off; /* real DEC bit algorithms not in use */
+ u_char tp_oktonagle; /* Last unsent pckt may be append to */
+ u_char tp_flags; /* values: */
+#define TPF_NLQOS_PDN TPFLAG_NLQOS_PDN
#define TPF_PEER_ON_SAMENET TPFLAG_PEER_ON_SAMENET
#define TPF_GENERAL_ADDR TPFLAG_GENERAL_ADDR
#define TPF_DELACK 0x8
#define USES_PDN(t) (((t)->tp_flags & TPF_NLQOS_PDN) != 0)
- unsigned
- tp_sendfcc:1, /* shall next ack include FCC parameter? */
- tp_trace:1, /* is this pcb being traced? (not used yet) */
- tp_perf_on:1, /* 0/1 -> performance measuring on */
- tp_reneged:1, /* have we reneged on cdt since last ack? */
- tp_decbit:3, /* dec bit was set, we're in reneg mode */
- tp_notdetached:1; /* Call tp_detach before freeing XXXXXXX */
+ unsigned
+ tp_sendfcc:1, /* shall next ack include FCC
+ * parameter? */
+ tp_trace:1, /* is this pcb being traced? (not
+ * used yet) */
+ tp_perf_on:1, /* 0/1 -> performance measuring on */
+ tp_reneged:1, /* have we reneged on cdt since last
+ * ack? */
+ tp_decbit:3, /* dec bit was set, we're in reneg
+ * mode */
+ tp_notdetached:1; /* Call tp_detach before
+ * freeing XXXXXXX */
#ifdef TP_PERF_MEAS
/* performance stats - see tp_stat.h */
- struct tp_pmeas *tp_p_meas;
-#endif /* TP_PERF_MEAS */
+ struct tp_pmeas *tp_p_meas;
+#endif /* TP_PERF_MEAS */
/* addressing */
- u_short tp_domain; /* domain (INET, ISO) */
- /* for compatibility with the *old* way and with INET, be sure that
- * that lsuffix and fsuffix are aligned to a short addr.
- * having them follow the u_short *suffixlen should suffice (choke)
+ u_short tp_domain; /* domain (INET, ISO) */
+ /*
+ * for compatibility with the *old* way and with INET, be sure that
+ * that lsuffix and fsuffix are aligned to a short addr. having them
+ * follow the u_short *suffixlen should suffice (choke)
*/
- u_short tp_fsuffixlen; /* foreign suffix */
- char tp_fsuffix[MAX_TSAP_SEL_LEN];
- u_short tp_lsuffixlen; /* local suffix */
- char tp_lsuffix[MAX_TSAP_SEL_LEN];
+ u_short tp_fsuffixlen; /* foreign suffix */
+ char tp_fsuffix[MAX_TSAP_SEL_LEN];
+ u_short tp_lsuffixlen; /* local suffix */
+ char tp_lsuffix[MAX_TSAP_SEL_LEN];
#define SHORT_LSUFXP(tpcb) ((short *)((tpcb)->tp_lsuffix))
#define SHORT_FSUFXP(tpcb) ((short *)((tpcb)->tp_fsuffix))
/* Timer stuff */
- u_char tp_vers; /* protocol version */
- u_char tp_peer_acktime; /* used for DT retrans time */
- u_char tp_refstate; /* values REF_FROZEN, etc. above */
- struct tp_pcb *tp_fasttimeo; /* limit pcbs to examine */
- u_int tp_timer[TM_NTIMERS]; /* C timers */
-
- struct sockbuf tp_Xsnd; /* for expedited data */
-/* struct sockbuf tp_Xrcv; /* for expedited data */
+ u_char tp_vers;/* protocol version */
+ u_char tp_peer_acktime; /* used for DT retrans time */
+ u_char tp_refstate; /* values REF_FROZEN, etc. above */
+ struct tp_pcb *tp_fasttimeo; /* limit pcbs to examine */
+ u_int tp_timer[TM_NTIMERS]; /* C timers */
+
+ struct sockbuf tp_Xsnd; /* for expedited data */
+#if 0
+ struct sockbuf tp_Xrcv; /* for expedited data */
+#else
#define tp_Xrcv tp_sock->so_rcv
- SeqNum tp_Xsndnxt; /* next XPD seq # to send */
- SeqNum tp_Xuna; /* seq # of unacked XPD */
- SeqNum tp_Xrcvnxt; /* next XPD seq # expect to recv */
+#endif
+ SeqNum tp_Xsndnxt; /* next XPD seq # to send */
+ SeqNum tp_Xuna;/* seq # of unacked XPD */
+ SeqNum tp_Xrcvnxt; /* next XPD seq # expect to recv */
/* AK subsequencing */
- u_short tp_s_subseq; /* next subseq to send */
- u_short tp_r_subseq; /* highest recv subseq */
+ u_short tp_s_subseq; /* next subseq to send */
+ u_short tp_r_subseq; /* highest recv subseq */
};
-u_int tp_start_win;
+u_int tp_start_win;
#define ROUND(scaled_int) (((scaled_int) >> 8) + (((scaled_int) & 0x80) ? 1:0))
#define CONG_UPDATE_SAMPLE(pcb, ce_bit) \
pcb->tp_cong_sample.cs_received++; \
if (ce_bit) { \
- pcb->tp_cong_sample.cs_ce_set++; \
+ pcb->tp_cong_sample.cs_ce_set++; \
} \
if (pcb->tp_cong_sample.cs_size <= pcb->tp_cong_sample.cs_received) { \
- if ((pcb->tp_cong_sample.cs_ce_set << 1) >= \
- pcb->tp_cong_sample.cs_size ) { \
- pcb->tp_win_recv -= pcb->tp_win_recv >> 3; /* multiply by .875 */ \
- pcb->tp_win_recv = max(1 << 8, pcb->tp_win_recv); \
- } \
- else { \
- pcb->tp_win_recv += (1 << 8); /* add one to the scaled int */ \
- } \
- pcb->tp_lcredit = ROUND(pcb->tp_win_recv); \
- CONG_INIT_SAMPLE(pcb); \
+ if ((pcb->tp_cong_sample.cs_ce_set << 1) >= \
+ pcb->tp_cong_sample.cs_size ) { \
+ pcb->tp_win_recv -= pcb->tp_win_recv >> 3; /* multiply by .875 */ \
+ pcb->tp_win_recv = max(1 << 8, pcb->tp_win_recv); \
+ } \
+ else { \
+ pcb->tp_win_recv += (1 << 8); /* add one to the scaled int */ \
+ } \
+ pcb->tp_lcredit = ROUND(pcb->tp_win_recv); \
+ CONG_INIT_SAMPLE(pcb); \
}
#ifdef _KERNEL
-extern struct tp_refinfo tp_refinfo;
-extern struct tp_ref *tp_ref;
-extern struct tp_param tp_param;
-extern struct nl_protosw nl_protosw[];
-extern struct tp_pcb *tp_listeners;
-extern struct tp_pcb *tp_ftimeolist;
+extern struct tp_refinfo tp_refinfo;
+extern struct tp_ref *tp_ref;
+extern struct tp_param tp_param;
+extern struct nl_protosw nl_protosw[];
+extern struct tp_pcb *tp_listeners;
+extern struct tp_pcb *tp_ftimeolist;
#endif
-#define sototpcb(so) ((struct tp_pcb *)(so->so_pcb))
-#define sototpref(so) ((sototpcb(so)->tp_ref))
-#define tpcbtoso(tp) ((struct socket *)((tp)->tp_sock))
-#define tpcbtoref(tp) ((struct tp_ref *)((tp)->tp_ref))
+#define sototpcb(so) ((struct tp_pcb *)(so->so_pcb))
+#define sototpref(so) ((sototpcb(so)->tp_ref))
+#define tpcbtoso(tp) ((struct socket *)((tp)->tp_sock))
+#define tpcbtoref(tp) ((struct tp_ref *)((tp)->tp_ref))
-#endif /* _NETISO_TP_PCB_H_ */
+#endif /* _NETISO_TP_PCB_H_ */
-/* $NetBSD: tp_seq.h,v 1.5 1994/06/29 06:40:29 cgd Exp $ */
+/* $OpenBSD: tp_seq.h,v 1.2 1996/03/04 10:36:22 mickey Exp $ */
+/* $NetBSD: tp_seq.h,v 1.6 1996/02/13 22:11:48 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
/*
* ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison
*/
-/*
+/*
* These macros perform sequence number arithmetic modulo (2**7 or 2**31).
- * The relevant fields in the tpcb are:
- * tp_seqmask : the mask of bits that define the sequence space.
- * tp_seqbit : 1 + tp_seqmask
- * tp_seqhalf : tp_seqbit / 2 or half the sequence space (rounded up)
- * Not exactly fast, but at least it's maintainable.
+ * The relevant fields in the tpcb are: tp_seqmask : the mask of bits that
+ * define the sequence space. tp_seqbit : 1 + tp_seqmask tp_seqhalf :
+ * tp_seqbit / 2 or half the sequence space (rounded up) Not exactly fast,
+ * but at least it's maintainable.
*/
#ifndef _NETISO_TP_SEQ_H_
( ((int)((seq)-(operand)) < 0)\
? ((-(int)((seq)-(operand))) < (int)(tpcb)->tp_seqhalf)\
: !(((int)(seq)-(operand)) < (int)(tpcb)->tp_seqhalf))
-
+
#define SEQ_MIN(tpcb, a, b) ( SEQ_GT(tpcb, a, b) ? b : a)
#define SEQ_MAX(tpcb, a, b) ( SEQ_GT(tpcb, a, b) ? a : b)
#define IN_SWINDOW(tpcb, seq, lwe, uwe)\
( SEQ_GT(tpcb, seq, lwe) && SEQ_LEQ(tpcb, seq, uwe) )
-#endif /* _NETISO_TP_SEQ_H_ */
+#endif /* _NETISO_TP_SEQ_H_ */
-/* $NetBSD: tp_stat.h,v 1.5 1994/06/29 06:40:30 cgd Exp $ */
+/* $OpenBSD: tp_stat.h,v 1.2 1996/03/04 10:36:24 mickey Exp $ */
+/* $NetBSD: tp_stat.h,v 1.6 1996/02/13 22:11:53 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
/*
* ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison
*/
-/*
- * Here are the data structures in which the global
- * statistics(counters) are gathered.
+/*
+ * Here are the data structures in which the global statistics(counters) are
+ * gathered.
*/
#ifndef _NETISO_TP_STAT_H_
#define _NETISO_TP_STAT_H_
struct tp_stat {
- u_long ts_param_ignored;
- u_long ts_unused3;
- u_long ts_bad_csum;
-
- u_long ts_inv_length;
- u_long ts_inv_pcode;
- u_long ts_inv_dutype;
- u_long ts_negotfailed;
- u_long ts_inv_dref;
- u_long ts_inv_pval;
- u_long ts_inv_sufx;
- u_long ts_inv_aclass;
-
- u_long ts_xtd_fmt;
- u_long ts_use_txpd;
- u_long ts_csum_off;
- u_long ts_send_drop;
- u_long ts_recv_drop;
-
- u_long ts_xpd_intheway;/* xpd mark caused data flow to stop */
- u_long ts_xpdmark_del; /* xpd markers thrown away */
- u_long ts_dt_ooo; /* dt tpdus received out of order */
- u_long ts_dt_niw; /* dt tpdus received & not in window */
- u_long ts_xpd_niw; /* xpd tpdus received & not in window */
- u_long ts_xpd_dup;
- u_long ts_dt_dup; /* dt tpdus received & are duplicates */
-
- u_long ts_zfcdt; /* # times f credit went down to 0 */
- u_long ts_lcdt_reduced; /*
- # times local cdt reduced on an acknowledgement.
- */
-
- u_long ts_pkt_rcvd; /* from ip */
- u_long ts_tpdu_rcvd; /* accepted as a TPDU in tp_input */
- u_long ts_tpdu_sent;
- u_long ts_unused2;
-
- u_long ts_retrans_cr;
- u_long ts_retrans_cc;
- u_long ts_retrans_dr;
- u_long ts_retrans_dt;
- u_long ts_retrans_xpd;
- u_long ts_conn_gaveup;
-
- u_long ts_ER_sent;
- u_long ts_DT_sent;
- u_long ts_XPD_sent;
- u_long ts_AK_sent;
- u_long ts_XAK_sent;
- u_long ts_DR_sent;
- u_long ts_DC_sent;
- u_long ts_CR_sent;
- u_long ts_CC_sent;
-
- u_long ts_ER_rcvd;
- u_long ts_DT_rcvd;
- u_long ts_XPD_rcvd;
- u_long ts_AK_rcvd;
- u_long ts_XAK_rcvd;
- u_long ts_DR_rcvd;
- u_long ts_DC_rcvd;
- u_long ts_CR_rcvd;
- u_long ts_CC_rcvd;
-
- u_long ts_Eticks;
- u_long ts_Eexpired;
- u_long ts_Eset;
- u_long ts_Ecan_act;
- u_long ts_Cticks;
- u_long ts_Cexpired;
- u_long ts_Cset;
- u_long ts_Ccan_act;
- u_long ts_Ccan_inact;
- u_long ts_Fdelack;
- u_long ts_Fpruned;
-
- u_long ts_concat_rcvd;
-
- u_long ts_zdebug; /* zero dref to test timeout on conn estab tp_input.c */
- u_long ts_ydebug; /* throw away pseudo-random pkts tp_input.c */
- u_long ts_unused5;
- u_long ts_unused; /* kludged concat to test separation tp_emit.c */
- u_long ts_vdebug; /* kludge to test input size checking tp_emit.c */
- u_long ts_unused4;
- u_long ts_ldebug; /* faked a renegging of credit */
-
- u_long ts_mb_small;
- u_long ts_mb_cluster;
- u_long ts_mb_len_distr[17];
-
- u_long ts_eot_input;
- u_long ts_eot_user;
- u_long ts_EOT_sent;
- u_long ts_tp0_conn;
- u_long ts_tp4_conn;
- u_long ts_quench;
- u_long ts_rcvdecbit;
+ u_long ts_param_ignored;
+ u_long ts_unused3;
+ u_long ts_bad_csum;
+
+ u_long ts_inv_length;
+ u_long ts_inv_pcode;
+ u_long ts_inv_dutype;
+ u_long ts_negotfailed;
+ u_long ts_inv_dref;
+ u_long ts_inv_pval;
+ u_long ts_inv_sufx;
+ u_long ts_inv_aclass;
+
+ u_long ts_xtd_fmt;
+ u_long ts_use_txpd;
+ u_long ts_csum_off;
+ u_long ts_send_drop;
+ u_long ts_recv_drop;
+
+ u_long ts_xpd_intheway; /* xpd mark caused data flow
+ * to stop */
+ u_long ts_xpdmark_del; /* xpd markers thrown away */
+ u_long ts_dt_ooo; /* dt tpdus received out of order */
+ u_long ts_dt_niw; /* dt tpdus received & not in window */
+ u_long ts_xpd_niw; /* xpd tpdus received & not in window */
+ u_long ts_xpd_dup;
+ u_long ts_dt_dup; /* dt tpdus received & are duplicates */
+
+ u_long ts_zfcdt; /* # times f credit went down to 0 */
+ u_long ts_lcdt_reduced; /* # times local cdt reduced
+ * on an acknowledgement. */
+
+ u_long ts_pkt_rcvd; /* from ip */
+ u_long ts_tpdu_rcvd; /* accepted as a TPDU in tp_input */
+ u_long ts_tpdu_sent;
+ u_long ts_unused2;
+
+ u_long ts_retrans_cr;
+ u_long ts_retrans_cc;
+ u_long ts_retrans_dr;
+ u_long ts_retrans_dt;
+ u_long ts_retrans_xpd;
+ u_long ts_conn_gaveup;
+
+ u_long ts_ER_sent;
+ u_long ts_DT_sent;
+ u_long ts_XPD_sent;
+ u_long ts_AK_sent;
+ u_long ts_XAK_sent;
+ u_long ts_DR_sent;
+ u_long ts_DC_sent;
+ u_long ts_CR_sent;
+ u_long ts_CC_sent;
+
+ u_long ts_ER_rcvd;
+ u_long ts_DT_rcvd;
+ u_long ts_XPD_rcvd;
+ u_long ts_AK_rcvd;
+ u_long ts_XAK_rcvd;
+ u_long ts_DR_rcvd;
+ u_long ts_DC_rcvd;
+ u_long ts_CR_rcvd;
+ u_long ts_CC_rcvd;
+
+ u_long ts_Eticks;
+ u_long ts_Eexpired;
+ u_long ts_Eset;
+ u_long ts_Ecan_act;
+ u_long ts_Cticks;
+ u_long ts_Cexpired;
+ u_long ts_Cset;
+ u_long ts_Ccan_act;
+ u_long ts_Ccan_inact;
+ u_long ts_Fdelack;
+ u_long ts_Fpruned;
+
+ u_long ts_concat_rcvd;
+
+ u_long ts_zdebug; /* zero dref to test timeout on conn
+ * estab tp_input.c */
+ u_long ts_ydebug; /* throw away pseudo-random pkts
+ * tp_input.c */
+ u_long ts_unused5;
+ u_long ts_unused; /* kludged concat to test separation
+ * tp_emit.c */
+ u_long ts_vdebug; /* kludge to test input size checking
+ * tp_emit.c */
+ u_long ts_unused4;
+ u_long ts_ldebug; /* faked a renegging of credit */
+
+ u_long ts_mb_small;
+ u_long ts_mb_cluster;
+ u_long ts_mb_len_distr[17];
+
+ u_long ts_eot_input;
+ u_long ts_eot_user;
+ u_long ts_EOT_sent;
+ u_long ts_tp0_conn;
+ u_long ts_tp4_conn;
+ u_long ts_quench;
+ u_long ts_rcvdecbit;
#define NRTT_CATEGORIES 4
- /* The 4 categories are:
- * 0 --> tp_flags: ~TPF_PEER_ON_SAMENET | TPF_NL_PDN
- * 1 --> tp_flags: ~TPF_PEER_ON_SAMENET | ~TPF_NL_PDN
- * 2 --> tp_flags: TPF_PEER_ON_SAMENET | ~TPF_NL_PDN
- * 3 --> tp_flags: TPF_PEER_ON_SAMENET | TPF_NL_PDN
+ /*
+ * The 4 categories are: 0 --> tp_flags: ~TPF_PEER_ON_SAMENET |
+ * TPF_NL_PDN 1 --> tp_flags: ~TPF_PEER_ON_SAMENET | ~TPF_NL_PDN 2
+ * --> tp_flags: TPF_PEER_ON_SAMENET | ~TPF_NL_PDN 3 --> tp_flags:
+ * TPF_PEER_ON_SAMENET | TPF_NL_PDN
+ */
+ int ts_rtt[NRTT_CATEGORIES];
+ int ts_rtv[NRTT_CATEGORIES];
+
+ u_long ts_ackreason[_ACK_NUM_REASONS_];
+ /*
+ * ACK_DONT 0 / ACK_STRAT_EACH 0x1 / ACK_STRAT_FULLWIN 0x4 ACK_DUP
+ * 0x8 / ACK_EOT 0x10 / ACK_REORDER 0x20 ACK_USRRCV ** ACK_FCC **
*/
- int ts_rtt[NRTT_CATEGORIES];
- int ts_rtv[NRTT_CATEGORIES];
-
- u_long ts_ackreason[_ACK_NUM_REASONS_];
- /* ACK_DONT 0 / ACK_STRAT_EACH 0x1 / ACK_STRAT_FULLWIN 0x4
- * ACK_DUP 0x8 / ACK_EOT 0x10 / ACK_REORDER 0x20
- * ACK_USRRCV **
- * ACK_FCC **
- */
-} tp_stat ;
-#define TP_PM_MAX 0xa /* 10 decimal */
+} tp_stat;
+#define TP_PM_MAX 0xa /* 10 decimal */
#define IncStat(x) tp_stat./**/x/**/++
#ifdef TP_PERF_MEAS
-#define PStat(Tpcb, X) (Tpcb)->tp_p_meas->/**/X/**/
+#define PStat(Tpcb, X) (Tpcb)->tp_p_meas->/**/X /**/
#define IncPStat(Tpcb, X) if((Tpcb)->tp_perf_on) (Tpcb)->tp_p_meas->/**/X/**/++
-/* BEWARE OF MACROS like this ^^^ must be sure it's surrounded by {} if
- * it's used in an if-else statement.
+/*
+ * BEWARE OF MACROS like this ^^^ must be sure it's surrounded by {} if it's
+ * used in an if-else statement.
*/
/* for perf measurement stuff: maximum window size it can handle */
struct tp_pmeas {
- /* the first few are distributions as a fn of window size
- * only keep enough space for normal format plus 1 slot for
- * extended format, in case any windows larger than 15 are used
- */
-
- /*
- * tps_npdusent: for each call to tp_sbsend, we inc the
- * element representing the number of pdus sent in this call
- */
- int tps_win_lim_by_cdt[TP_PM_MAX+1];
- int tps_win_lim_by_data[TP_PM_MAX+1];
- /*
- * tps_sendtime: Each call to tp_sbsend() is timed. For
- * Each window size, we keep the running average of the time
- * taken by tp_sbsend() for each window size.
- */
- int tps_sendtime[TP_PM_MAX+1];
- /*
- * n_TMsendack: # times ack sent because timer went off
- * n_ack_cuz_eot: # times ack sent due to EOTSDU on incoming packet
- * n_ack_cuz_dup: # times ack sent for receiving a duplicate pkt.
- * n_ack_cuz_fullwin: # times ack sent for receiving the full window.
- * n_ack_cuz_doack: # times ack sent for having just reordered data.
- */
- int tps_n_TMsendack;
- int tps_n_ack_cuz_eot;
- int tps_n_ack_cuz_fullwin;
- int tps_n_ack_cuz_reorder;
- int tps_n_ack_cuz_dup;
- int tps_n_ack_cuz_strat;
- /*
- * when we send an ack: how much less than the "expected" window
- * did we actually ack. For example: if we last sent a credit
- * of 10, and we're acking now for whatever reason, and have
- * only received 6 since our last credit advertisement, we'll
- * keep the difference, 4, in this variable.
- */
- int tps_ack_early[TP_PM_MAX+1];
- /*
- * when we ack, for the # pkts we actually acked w/ this ack,
- * how much cdt are we advertising?
- * [ size of window acknowledged ] [ cdt we're giving ]
- */
- int tps_cdt_acked[TP_PM_MAX+1][TP_PM_MAX+1];
-
- int tps_AK_sent;
- int tps_XAK_sent;
- int tps_DT_sent;
- int tps_XPD_sent;
- int tps_AK_rcvd;
- int tps_XAK_rcvd;
- int tps_DT_rcvd;
- int tps_XPD_rcvd;
-
- int Nb_from_sess;
- int Nb_to_sess;
- int Nb_to_ll;
- int Nb_from_ll;
+ /*
+ * the first few are distributions as a fn of window size only keep
+ * enough space for normal format plus 1 slot for extended format, in
+ * case any windows larger than 15 are used
+ */
+
+ /*
+ * tps_npdusent: for each call to tp_sbsend, we inc the element
+ * representing the number of pdus sent in this call
+ */
+ int tps_win_lim_by_cdt[TP_PM_MAX + 1];
+ int tps_win_lim_by_data[TP_PM_MAX + 1];
+ /*
+ * tps_sendtime: Each call to tp_sbsend() is timed. For Each window
+ * size, we keep the running average of the time taken by tp_sbsend()
+ * for each window size.
+ */
+ int tps_sendtime[TP_PM_MAX + 1];
+ /*
+ * n_TMsendack: # times ack sent because timer went off
+ * n_ack_cuz_eot: # times ack sent due to EOTSDU on incoming packet
+ * n_ack_cuz_dup: # times ack sent for receiving a duplicate pkt.
+ * n_ack_cuz_fullwin: # times ack sent for receiving the full window.
+ * n_ack_cuz_doack: # times ack sent for having just reordered data.
+ */
+ int tps_n_TMsendack;
+ int tps_n_ack_cuz_eot;
+ int tps_n_ack_cuz_fullwin;
+ int tps_n_ack_cuz_reorder;
+ int tps_n_ack_cuz_dup;
+ int tps_n_ack_cuz_strat;
+ /*
+ * when we send an ack: how much less than the "expected" window
+ * did we actually ack. For example: if we last sent a credit
+ * of 10, and we're acking now for whatever reason, and have
+ * only received 6 since our last credit advertisement, we'll
+ * keep the difference, 4, in this variable.
+ */
+ int tps_ack_early[TP_PM_MAX + 1];
+ /*
+ * when we ack, for the # pkts we actually acked w/ this ack,
+ * how much cdt are we advertising?
+ * [ size of window acknowledged ] [ cdt we're giving ]
+ */
+ int tps_cdt_acked[TP_PM_MAX + 1][TP_PM_MAX + 1];
+
+ int tps_AK_sent;
+ int tps_XAK_sent;
+ int tps_DT_sent;
+ int tps_XPD_sent;
+ int tps_AK_rcvd;
+ int tps_XAK_rcvd;
+ int tps_DT_rcvd;
+ int tps_XPD_rcvd;
+
+ int Nb_from_sess;
+ int Nb_to_sess;
+ int Nb_to_ll;
+ int Nb_from_ll;
};
-#define IFPERF(tpcb) if (tpcb->tp_perf_on && tpcb->tp_p_meas) {
-#define ENDPERF }
#else
-int PStat_Junk;
+int PStat_Junk;
#define PStat(tpcb, x) PStat_Junk
-#define IncPStat(tpcb, x) /* no-op */
+#define IncPStat(tpcb, x) /* no-op */
#define tpmeas(a,b,c,d,e,f) 0
-#define IFPERF(x) if (0) {
-#define ENDPERF }
+#endif /* TP_PERF_MEAS */
+
-#endif /* TP_PERF_MEAS */
+#define DOPERF(tpcb) (tpcb->tp_perf_on && tpcb->tp_p_meas)
-#endif /* _NETISO_TP_STAT_H_ */
+#endif /* _NETISO_TP_STAT_H_ */
+/* $OpenBSD: tp_states.h,v 1.2 1996/03/04 10:36:26 mickey Exp $ */
/* $NetBSD: tp_states.h,v 1.4 1994/06/29 06:40:31 cgd Exp $ */
#define ST_ERROR 0x0
+/* $OpenBSD: tp_states.init,v 1.2 1996/03/04 10:36:27 mickey Exp $ */
/* $NetBSD: tp_states.init,v 1.4 1994/06/29 06:40:33 cgd Exp $ */
{0x3,0x0},
-/* $NetBSD: tp_subr.c,v 1.6 1995/08/04 01:13:29 mycroft Exp $ */
+/* $OpenBSD: tp_subr.c,v 1.2 1996/03/04 10:36:29 mickey Exp $ */
+/* $NetBSD: tp_subr.c,v 1.7 1996/02/13 22:11:59 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
/*
* ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison
*/
-/*
- * The main work of data transfer is done here.
- * These routines are called from tp.trans.
- * They include the routines that check the validity of acks and Xacks,
- * (tp_goodack() and tp_goodXack() )
- * take packets from socket buffers and send them (tp_send()),
- * drop the data from the socket buffers (tp_sbdrop()),
- * and put incoming packet data into socket buffers (tp_stash()).
+/*
+ * The main work of data transfer is done here. These routines are called
+ * from tp.trans. They include the routines that check the validity of acks
+ * and Xacks, (tp_goodack() and tp_goodXack() ) take packets from socket
+ * buffers and send them (tp_send()), drop the data from the socket buffers
+ * (tp_sbdrop()), and put incoming packet data into socket buffers
+ * (tp_stash()).
*/
#include <sys/param.h>
#include <netiso/tp_trace.h>
#include <netiso/tp_meas.h>
#include <netiso/tp_seq.h>
+#include <netiso/tp_var.h>
-int tp_emit(), tp_sbdrop();
-int tprexmtthresh = 3;
-extern int ticks;
-void tp_send();
+int tprexmtthresh = 3;
+extern int ticks;
/*
* CALLED FROM:
* tp.trans, when an XAK arrives
* FUNCTION and ARGUMENTS:
- * Determines if the sequence number (seq) from the XAK
+ * Determines if the sequence number (seq) from the XAK
* acks anything new. If so, drop the appropriate tpdu
* from the XPD send queue.
* RETURN VALUE:
*/
int
tp_goodXack(tpcb, seq)
- struct tp_pcb *tpcb;
- SeqNum seq;
+ struct tp_pcb *tpcb;
+ SeqNum seq;
{
- IFTRACE(D_XPD)
- tptraceTPCB(TPPTgotXack,
- seq, tpcb->tp_Xuna, tpcb->tp_Xsndnxt, tpcb->tp_sndnew,
- tpcb->tp_snduna);
- ENDTRACE
-
- if ( seq == tpcb->tp_Xuna ) {
- tpcb->tp_Xuna = tpcb->tp_Xsndnxt;
-
- /* DROP 1 packet from the Xsnd socket buf - just so happens
- * that only one packet can be there at any time
- * so drop the whole thing. If you allow > 1 packet
- * the socket buffer, then you'll have to keep
- * track of how many characters went w/ each XPD tpdu, so this
- * will get messier
- */
- IFDEBUG(D_XPD)
- dump_mbuf(tpcb->tp_Xsnd.sb_mb,
- "tp_goodXack Xsnd before sbdrop");
- ENDDEBUG
-
- IFTRACE(D_XPD)
- tptraceTPCB(TPPTmisc,
- "goodXack: dropping cc ",
- (int)(tpcb->tp_Xsnd.sb_cc),
- 0,0,0);
- ENDTRACE
- sbdroprecord(&tpcb->tp_Xsnd);
- return 1;
- }
+#ifdef TPPT
+ if (tp_traceflags[D_XPD]) {
+ tptraceTPCB(TPPTgotXack,
+ seq, tpcb->tp_Xuna, tpcb->tp_Xsndnxt, tpcb->tp_sndnew,
+ tpcb->tp_snduna);
+ }
+#endif
+
+ if (seq == tpcb->tp_Xuna) {
+ tpcb->tp_Xuna = tpcb->tp_Xsndnxt;
+
+ /*
+ * DROP 1 packet from the Xsnd socket buf - just so happens
+ * that only one packet can be there at any time so drop the
+ * whole thing. If you allow > 1 packet the socket buffer,
+ * then you'll have to keep track of how many characters went
+ * w/ each XPD tpdu, so this will get messier
+ */
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_XPD]) {
+ dump_mbuf(tpcb->tp_Xsnd.sb_mb,
+ "tp_goodXack Xsnd before sbdrop");
+ }
+#endif
+
+#ifdef TPPT
+ if (tp_traceflags[D_XPD]) {
+ tptraceTPCB(TPPTmisc,
+ "goodXack: dropping cc ",
+ (int) (tpcb->tp_Xsnd.sb_cc),
+ 0, 0, 0);
+ }
+#endif
+ sbdroprecord(&tpcb->tp_Xsnd);
+ return 1;
+ }
return 0;
}
void
tp_rtt_rtv(tpcb)
-register struct tp_pcb *tpcb;
+ register struct tp_pcb *tpcb;
{
- int old = tpcb->tp_rtt;
- int delta, elapsed = ticks - tpcb->tp_rttemit;
+ int old = tpcb->tp_rtt;
+ int delta = 0,
+ elapsed = ticks - tpcb->tp_rttemit;
if (tpcb->tp_rtt != 0) {
/*
- * rtt is the smoothed round trip time in machine clock ticks (hz).
- * It is stored as a fixed point number, unscaled (unlike the tcp
- * srtt). The rationale here is that it is only significant to the
- * nearest unit of slowtimo, which is at least 8 machine clock ticks
- * so there is no need to scale. The smoothing is done according
- * to the same formula as TCP (rtt = rtt*7/8 + measured_rtt/8).
+ * rtt is the smoothed round trip time in machine clock
+ * ticks (hz). It is stored as a fixed point number,
+ * unscaled (unlike the tcp srtt). The rationale here
+ * is that it is only significant to the nearest unit of
+ * slowtimo, which is at least 8 machine clock ticks
+ * so there is no need to scale. The smoothing is done
+ * according to the same formula as TCP (rtt = rtt*7/8
+ * + measured_rtt/8).
*/
delta = elapsed - tpcb->tp_rtt;
if ((tpcb->tp_rtt += (delta >> TP_RTT_ALPHA)) <= 0)
if ((tpcb->tp_rtv += ((delta - tpcb->tp_rtv) >> TP_RTV_ALPHA)) <= 0)
tpcb->tp_rtv = 1;
} else {
- /*
- * No rtt measurement yet - use the unsmoothed rtt.
- * Set the variance to half the rtt (so our first
- * retransmit happens at 3*rtt)
+ /*
+ * No rtt measurement yet - use the unsmoothed rtt. Set the
+ * variance to half the rtt (so our first retransmit happens
+ * at 3*rtt)
*/
tpcb->tp_rtt = elapsed;
tpcb->tp_rtv = elapsed >> 1;
* the minimum feasible timer (which is 2 ticks)."
*/
TP_RANGESET(tpcb->tp_dt_ticks, TP_REXMTVAL(tpcb),
- tpcb->tp_peer_acktime, 128 /* XXX */);
- IFDEBUG(D_RTT)
+ tpcb->tp_peer_acktime, 128 /* XXX */ );
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_RTT]) {
printf("%s tpcb 0x%x, elapsed %d, delta %d, rtt %d, rtv %d, old %d\n",
- "tp_rtt_rtv:",tpcb,elapsed,delta,tpcb->tp_rtt,tpcb->tp_rtv,old);
- ENDDEBUG
+ "tp_rtt_rtv:", tpcb, elapsed, delta, tpcb->tp_rtt, tpcb->tp_rtv, old);
+ }
+#endif
tpcb->tp_rxtcur = tpcb->tp_dt_ticks;
}
* CALLED FROM:
* tp.trans when an AK arrives
* FUNCTION and ARGUMENTS:
- * Given (cdt), the credit from the AK tpdu, and
+ * Given (cdt), the credit from the AK tpdu, and
* (seq), the sequence number from the AK tpdu,
* tp_goodack() determines if the AK acknowledges something in the send
* window, and if so, drops the appropriate packets from the retransmission
*/
int
tp_goodack(tpcb, cdt, seq, subseq)
- register struct tp_pcb *tpcb;
- u_int cdt;
- register SeqNum seq;
- u_int subseq;
+ register struct tp_pcb *tpcb;
+ u_int cdt;
+ register SeqNum seq;
+ u_int subseq;
{
- int old_fcredit;
- int bang = 0; /* bang --> ack for something heretofore unacked */
- u_int bytes_acked;
+ int old_fcredit = 0;
+ int bang = 0; /* bang --> ack for something
+ * heretofore unacked */
+ u_int bytes_acked;
- IFDEBUG(D_ACKRECV)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ACKRECV]) {
printf("goodack tpcb 0x%x seq 0x%x cdt %d una 0x%x new 0x%x nxt 0x%x\n",
- tpcb, seq, cdt, tpcb->tp_snduna, tpcb->tp_sndnew, tpcb->tp_sndnxt);
- ENDDEBUG
- IFTRACE(D_ACKRECV)
- tptraceTPCB(TPPTgotack,
- seq,cdt, tpcb->tp_snduna,tpcb->tp_sndnew,subseq);
- ENDTRACE
+ tpcb, seq, cdt, tpcb->tp_snduna, tpcb->tp_sndnew, tpcb->tp_sndnxt);
+ }
+#endif
- IFPERF(tpcb)
- tpmeas(tpcb->tp_lref, TPtime_ack_rcvd, (struct timeval *)0, seq, 0, 0);
- ENDPERF
+#ifdef TPPT
+ if (tp_traceflags[D_ACKRECV]) {
+ tptraceTPCB(TPPTgotack,
+ seq, cdt, tpcb->tp_snduna, tpcb->tp_sndnew, subseq);
+ }
+#endif
+
+#ifdef TP_PERF_MEAS
+ if (DOPERF(tpcb)) {
+ tpmeas(tpcb->tp_lref, TPtime_ack_rcvd, (struct timeval *) 0, seq, 0, 0);
+ }
+#endif
if (seq == tpcb->tp_snduna) {
if (subseq < tpcb->tp_r_subseq ||
- (subseq == tpcb->tp_r_subseq && cdt <= tpcb->tp_fcredit)) {
- discard_the_ack:
- IFDEBUG(D_ACKRECV)
+ (subseq == tpcb->tp_r_subseq && cdt <= tpcb->tp_fcredit)) {
+ discard_the_ack:
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ACKRECV]) {
printf("goodack discard : tpcb 0x%x subseq %d r_subseq %d\n",
- tpcb, subseq, tpcb->tp_r_subseq);
- ENDDEBUG
+ tpcb, subseq, tpcb->tp_r_subseq);
+ }
+#endif
goto done;
}
- if (cdt == tpcb->tp_fcredit /*&& thus subseq > tpcb->tp_r_subseq */) {
+ if (cdt == tpcb->tp_fcredit /* && thus subseq >
+ tpcb->tp_r_subseq */ ) {
tpcb->tp_r_subseq = subseq;
if (tpcb->tp_timer[TM_data_retrans] == 0)
tpcb->tp_dupacks = 0;
else if (++tpcb->tp_dupacks == tprexmtthresh) {
- /* partner went out of his way to signal with different
- subsequences that he has the same lack of an expected
- packet. This may be an early indiciation of a loss */
-
- SeqNum onxt = tpcb->tp_sndnxt;
- struct mbuf *onxt_m = tpcb->tp_sndnxt_m;
- u_int win = min(tpcb->tp_fcredit,
- tpcb->tp_cong_win / tpcb->tp_l_tpdusize) / 2;
- IFDEBUG(D_ACKRECV)
+ /*
+ * partner went out of his way to signal with
+ * different subsequences that he has the
+ * same lack of an expected packet. This may
+ * be an early indiciation of a loss
+ */
+
+ SeqNum onxt = tpcb->tp_sndnxt;
+ struct mbuf *onxt_m = tpcb->tp_sndnxt_m;
+ u_int win = min(tpcb->tp_fcredit,
+ tpcb->tp_cong_win / tpcb->tp_l_tpdusize) / 2;
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ACKRECV]) {
printf("%s tpcb 0x%x seq 0x%x rttseq 0x%x onxt 0x%x\n",
- "goodack dupacks:", tpcb, seq, tpcb->tp_rttseq, onxt);
- ENDDEBUG
+ "goodack dupacks:", tpcb, seq, tpcb->tp_rttseq, onxt);
+ }
+#endif
if (win < 2)
win = 2;
tpcb->tp_ssthresh = win * tpcb->tp_l_tpdusize;
tpcb->tp_sndnxt = onxt;
tpcb->tp_sndnxt_m = onxt_m;
}
-
} else if (tpcb->tp_dupacks > tprexmtthresh) {
tpcb->tp_cong_win += tpcb->tp_l_tpdusize;
}
* for the other side's cached packets, retract it.
*/
if (tpcb->tp_dupacks > tprexmtthresh &&
- tpcb->tp_cong_win > tpcb->tp_ssthresh)
- tpcb->tp_cong_win = tpcb->tp_ssthresh;
+ tpcb->tp_cong_win > tpcb->tp_ssthresh)
+ tpcb->tp_cong_win = tpcb->tp_ssthresh;
tpcb->tp_r_subseq = subseq;
old_fcredit = tpcb->tp_fcredit;
tpcb->tp_fcredit = cdt;
* open quickly enough.
*/
{
- u_int cw = tpcb->tp_cong_win, incr = tpcb->tp_l_tpdusize;
+ u_int cw = tpcb->tp_cong_win, incr = tpcb->tp_l_tpdusize;
incr = min(incr, bytes_acked);
if (cw > tpcb->tp_ssthresh)
}
tpcb->tp_snduna = seq;
if (SEQ_LT(tpcb, tpcb->tp_sndnxt, seq)) {
- tpcb->tp_sndnxt = seq;
- tpcb->tp_sndnxt_m = 0;
+ tpcb->tp_sndnxt = seq;
+ tpcb->tp_sndnxt_m = 0;
}
bang++;
- }
-
- if( cdt != 0 && old_fcredit == 0 ) {
+ }
+ if (cdt != 0 && old_fcredit == 0) {
tpcb->tp_sendfcc = 1;
}
if (cdt == 0) {
bang |= (old_fcredit < cdt);
done:
- IFDEBUG(D_ACKRECV)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ACKRECV]) {
printf("goodack returns 0x%x, cdt 0x%x ocdt 0x%x cwin 0x%x\n",
- bang, cdt, old_fcredit, tpcb->tp_cong_win);
- ENDDEBUG
- /* if (bang) XXXXX Very bad to remove this test, but somethings broken */
- tp_send(tpcb);
+ bang, cdt, old_fcredit, tpcb->tp_cong_win);
+ }
+#endif
+ /*
+ * if (bang) XXXXX Very bad to remove this test, but somethings
+ * broken
+ */
+ tp_send(tpcb);
return (bang);
}
* drops everything up TO but not INCLUDING seq # (seq)
* from the retransmission queue.
*/
-tp_sbdrop(tpcb, seq)
- register struct tp_pcb *tpcb;
- SeqNum seq;
+int
+tp_sbdrop(tpcb, seq)
+ register struct tp_pcb *tpcb;
+ SeqNum seq;
{
struct sockbuf *sb = &tpcb->tp_sock->so_snd;
- register int i = SEQ_SUB(tpcb, seq, tpcb->tp_snduna);
- int oldcc = sb->sb_cc, oldi = i;
+ register int i = SEQ_SUB(tpcb, seq, tpcb->tp_snduna);
+ int oldcc = sb->sb_cc, oldi = i;
if (i >= tpcb->tp_seqhalf)
printf("tp_spdropping too much -- should panic");
while (i-- > 0)
sbdroprecord(sb);
- IFDEBUG(D_ACKRECV)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ACKRECV]) {
printf("tp_sbdroping %d pkts %d bytes on %x at 0x%x\n",
- oldi, oldcc - sb->sb_cc, tpcb, seq);
- ENDDEBUG
+ oldi, oldcc - sb->sb_cc, tpcb, seq);
+ }
+#endif
if (sb_notify(sb))
sowwakeup(tpcb->tp_sock);
return (oldcc - sb->sb_cc);
*/
void
tp_send(tpcb)
- register struct tp_pcb *tpcb;
+ register struct tp_pcb *tpcb;
{
- register int len;
- register struct mbuf *m;
- struct mbuf *mb = 0;
- struct sockbuf *sb = &tpcb->tp_sock->so_snd;
- unsigned int eotsdu = 0;
- SeqNum highseq, checkseq;
- int idle, idleticks, off, cong_win;
+ register int len;
+ register struct mbuf *m;
+ struct mbuf *mb = 0;
+ struct sockbuf *sb = &tpcb->tp_sock->so_snd;
+ unsigned int eotsdu = 0;
+ SeqNum highseq, checkseq;
+ int idle, idleticks, off, cong_win;
#ifdef TP_PERF_MEAS
- int send_start_time = ticks;
- SeqNum oldnxt = tpcb->tp_sndnxt;
+ int send_start_time = ticks;
+ SeqNum oldnxt = tpcb->tp_sndnxt;
#endif /* TP_PERF_MEAS */
idle = (tpcb->tp_snduna == tpcb->tp_sndnew);
*/
tpcb->tp_cong_win = tpcb->tp_l_tpdusize;
}
-
cong_win = tpcb->tp_cong_win;
highseq = SEQ(tpcb, tpcb->tp_fcredit + tpcb->tp_snduna);
if (tpcb->tp_Xsnd.sb_mb)
highseq = SEQ_MIN(tpcb, highseq, tpcb->tp_sndnew);
-
- IFDEBUG(D_DATA)
+
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_DATA]) {
printf("tp_send enter tpcb 0x%x nxt 0x%x win %d high 0x%x\n",
- tpcb, tpcb->tp_sndnxt, cong_win, highseq);
- ENDDEBUG
- IFTRACE(D_DATA)
- tptraceTPCB( TPPTmisc, "tp_send sndnew snduna",
- tpcb->tp_sndnew, tpcb->tp_snduna, 0, 0);
- tptraceTPCB( TPPTmisc, "tp_send tpcb->tp_sndnxt win fcredit congwin",
- tpcb->tp_sndnxt, cong_win, tpcb->tp_fcredit, tpcb->tp_cong_win);
- ENDTRACE
- IFTRACE(D_DATA)
- tptraceTPCB( TPPTmisc, "tp_send 2 nxt high fcredit congwin",
- tpcb->tp_sndnxt, highseq, tpcb->tp_fcredit, cong_win);
- ENDTRACE
-
- if (tpcb->tp_sndnxt_m)
+ tpcb, tpcb->tp_sndnxt, cong_win, highseq);
+ }
+#endif
+#ifdef TPPT
+ if (tp_traceflags[D_DATA]) {
+ tptraceTPCB(TPPTmisc, "tp_send sndnew snduna",
+ tpcb->tp_sndnew, tpcb->tp_snduna, 0, 0);
+ tptraceTPCB(TPPTmisc, "tp_send tpcb->tp_sndnxt win fcredit congwin",
+ tpcb->tp_sndnxt, cong_win, tpcb->tp_fcredit, tpcb->tp_cong_win);
+ }
+#endif
+#ifdef TPPT
+ if (tp_traceflags[D_DATA]) {
+ tptraceTPCB(TPPTmisc, "tp_send 2 nxt high fcredit congwin",
+ tpcb->tp_sndnxt, highseq, tpcb->tp_fcredit, cong_win);
+ }
+#endif
+
+ if (tpcb->tp_sndnxt_m)
m = tpcb->tp_sndnxt_m;
else {
off = SEQ_SUB(tpcb, tpcb->tp_sndnxt, tpcb->tp_snduna);
for (m = sb->sb_mb; m && off > 0; m = m->m_next)
off--;
}
-send:
/*
* Avoid silly window syndrome here . . . figure out how!
*/
checkseq = tpcb->tp_sndnum;
if (idle && SEQ_LT(tpcb, tpcb->tp_sndnum, highseq))
- checkseq = highseq; /* i.e. DON'T retain highest assigned packet */
+ checkseq = highseq; /* i.e. DON'T retain highest assigned
+ * packet */
while ((SEQ_LT(tpcb, tpcb->tp_sndnxt, highseq)) && m && cong_win > 0) {
eotsdu = (m->m_flags & M_EOR) != 0;
len = m->m_pkthdr.len;
if (tpcb->tp_sndnxt == checkseq && eotsdu == 0 &&
- len < (tpcb->tp_l_tpdusize / 2))
- break; /* Nagle . . . . . */
+ len < (tpcb->tp_l_tpdusize / 2))
+ break; /* Nagle . . . . . */
cong_win -= len;
- /* make a copy - mb goes into the retransmission list
- * while m gets emitted. m_copy won't copy a zero-length mbuf.
+ /*
+ * make a copy - mb goes into the retransmission list while m
+ * gets emitted. m_copy won't copy a zero-length mbuf.
*/
mb = m;
m = m_copy(mb, 0, M_COPYALL);
if (m == MNULL)
- break;
- IFTRACE(D_STASH)
- tptraceTPCB( TPPTmisc,
- "tp_send mcopy nxt high eotsdu len",
- tpcb->tp_sndnxt, highseq, eotsdu, len);
- ENDTRACE
-
- IFDEBUG(D_DATA)
+ break;
+#ifdef TPPT
+ if (tp_traceflags[D_STASH]) {
+ tptraceTPCB(TPPTmisc,
+ "tp_send mcopy nxt high eotsdu len",
+ tpcb->tp_sndnxt, highseq, eotsdu, len);
+ }
+#endif
+
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_DATA]) {
printf("tp_sending tpcb 0x%x nxt 0x%x\n",
- tpcb, tpcb->tp_sndnxt);
- ENDDEBUG
- /* when headers are precomputed, may need to fill
- in checksum here */
- if (tpcb->tp_sock->so_error =
- tp_emit(DT_TPDU_type, tpcb, tpcb->tp_sndnxt, eotsdu, m)) {
+ tpcb, tpcb->tp_sndnxt);
+ }
+#endif
+ /*
+ * when headers are precomputed, may need to fill in checksum
+ * here
+ */
+ tpcb->tp_sock->so_error =
+ tp_emit(DT_TPDU_type, tpcb, tpcb->tp_sndnxt, eotsdu, m);
+ if (tpcb->tp_sock->so_error != 0)
/* error */
break;
- }
m = mb->m_nextpkt;
tpcb->tp_sndnxt_m = m;
if (tpcb->tp_sndnxt == tpcb->tp_sndnew) {
* of retransmit time.
*/
if (tpcb->tp_timer[TM_data_retrans] == 0 &&
- tpcb->tp_class != TP_CLASS_0) {
+ tpcb->tp_class != TP_CLASS_0) {
tpcb->tp_timer[TM_data_retrans] = tpcb->tp_dt_ticks;
tpcb->tp_timer[TM_sendack] = tpcb->tp_keepalive_ticks;
tpcb->tp_rxtshift = 0;
if (SEQ_GT(tpcb, tpcb->tp_sndnew, tpcb->tp_sndnum))
tpcb->tp_oktonagle = 0;
#ifdef TP_PERF_MEAS
- IFPERF(tpcb)
- {
- register int npkts;
- int elapsed = ticks - send_start_time, *t;
- struct timeval now;
+ if (DOPERF(tpcb)) {
+ register int npkts;
+ int elapsed = ticks - send_start_time, *t;
+ struct timeval now;
- npkts = SEQ_SUB(tpcb, tpcb->tp_sndnxt, oldnxt);
+ npkts = SEQ_SUB(tpcb, tpcb->tp_sndnxt, oldnxt);
- if (npkts > 0)
- tpcb->tp_Nwindow++;
+ if (npkts > 0)
+ tpcb->tp_Nwindow++;
- if (npkts > TP_PM_MAX)
- npkts = TP_PM_MAX;
+ if (npkts > TP_PM_MAX)
+ npkts = TP_PM_MAX;
- t = &(tpcb->tp_p_meas->tps_sendtime[npkts]);
- *t += (t - elapsed) >> TP_RTT_ALPHA;
+ t = &(tpcb->tp_p_meas->tps_sendtime[npkts]);
+ *t += (t - elapsed) >> TP_RTT_ALPHA;
- if (mb == 0) {
- IncPStat(tpcb, tps_win_lim_by_data[npkts] );
- } else {
- IncPStat(tpcb, tps_win_lim_by_cdt[npkts] );
- /* not true with congestion-window being used */
- }
- now.tv_sec = elapsed / hz;
- now.tv_usec = (elapsed - (hz * now.tv_sec)) * 1000000 / hz;
- tpmeas( tpcb->tp_lref,
- TPsbsend, &elapsed, newseq, tpcb->tp_Nwindow, npkts);
+ if (mb == 0) {
+ IncPStat(tpcb, tps_win_lim_by_data[npkts]);
+ } else {
+ IncPStat(tpcb, tps_win_lim_by_cdt[npkts]);
+ /* not true with congestion-window being used */
}
- ENDPERF
-#endif /* TP_PERF_MEAS */
+ now.tv_sec = elapsed / hz;
+ now.tv_usec = (elapsed - (hz * now.tv_sec)) * 1000000 / hz;
+ tpmeas(tpcb->tp_lref,
+ TPsbsend, &elapsed, newseq, tpcb->tp_Nwindow, npkts);
+ }
+#endif /* TP_PERF_MEAS */
+
+#ifdef TPPT
+ if (tp_traceflags[D_DATA]) {
+ tptraceTPCB(TPPTmisc,
+ "tp_send at end: new nxt eotsdu error",
+ tpcb->tp_sndnew, tpcb->tp_sndnxt, eotsdu,
+ tpcb->tp_sock->so_error);
- IFTRACE(D_DATA)
- tptraceTPCB( TPPTmisc,
- "tp_send at end: new nxt eotsdu error",
- tpcb->tp_sndnew, tpcb->tp_sndnxt, eotsdu, tpcb->tp_sock->so_error);
-
- ENDTRACE
+ }
+#endif
}
-int TPNagleok;
-int TPNagled;
+int TPNagleok;
+int TPNagled;
+int
tp_packetize(tpcb, m, eotsdu)
-register struct tp_pcb *tpcb;
-register struct mbuf *m;
-int eotsdu;
+ register struct tp_pcb *tpcb;
+ register struct mbuf *m;
+ int eotsdu;
{
- register struct mbuf *n;
+ register struct mbuf *n = NULL;
register struct sockbuf *sb = &tpcb->tp_sock->so_snd;
- int maxsize = tpcb->tp_l_tpdusize
- - tp_headersize(DT_TPDU_type, tpcb)
- - (tpcb->tp_use_checksum?4:0) ;
- int totlen = m->m_pkthdr.len;
- struct mbuf *m_split();
+ int maxsize = tpcb->tp_l_tpdusize
+ - tp_headersize(DT_TPDU_type, tpcb)
+ - (tpcb->tp_use_checksum ? 4 : 0);
+ int totlen = m->m_pkthdr.len;
+
/*
* Pre-packetize the data in the sockbuf
* according to negotiated mtu. Do it here
* This presumes knowledge of sockbuf conventions.
* TODO: allocate space for header and fill it in (once!).
*/
- IFDEBUG(D_DATA)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_DATA]) {
printf("SEND BF: maxsize %d totlen %d eotsdu %d sndnum 0x%x\n",
- maxsize, totlen, eotsdu, tpcb->tp_sndnum);
- ENDTRACE
+ maxsize, totlen, eotsdu, tpcb->tp_sndnum);
+ }
+#endif
if (tpcb->tp_oktonagle) {
if ((n = sb->sb_mb) == 0)
panic("tp_packetize");
panic("tp_packetize 2");
SEQ_INC(tpcb, tpcb->tp_sndnum);
if (totlen + n->m_pkthdr.len < maxsize) {
- /* There is an unsent packet with space, combine data */
- struct mbuf *old_n = n;
- tpsbcheck(tpcb,3);
+ /*
+ * There is an unsent packet with space,
+ * combine data
+ */
+ struct mbuf *old_n = n;
+ tpsbcheck(tpcb, 3);
n->m_pkthdr.len += totlen;
while (n->m_next)
n = n->m_next;
sbcompress(sb, m, n);
- tpsbcheck(tpcb,4);
+ tpsbcheck(tpcb, 4);
n = old_n;
TPNagled++;
goto out;
}
}
+
while (m) {
n = m;
if (totlen > maxsize) {
}
out:
if (eotsdu) {
- n->m_flags |= M_EOR; /* XXX belongs at end */
+ n->m_flags |= M_EOR; /* XXX belongs at end */
tpcb->tp_oktonagle = 0;
} else {
SEQ_DEC(tpcb, tpcb->tp_sndnum);
tpcb->tp_oktonagle = 1;
TPNagleok++;
}
- IFDEBUG(D_DATA)
+
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_DATA]) {
printf("SEND out: oktonagle %d sndnum 0x%x\n",
- tpcb->tp_oktonagle, tpcb->tp_sndnum);
- ENDTRACE
+ tpcb->tp_oktonagle, tpcb->tp_sndnum);
+ }
+#endif
return 0;
}
* CALLED FROM:
* tp.trans on arrival of a DT tpdu
* FUNCTION, ARGUMENTS, and RETURN VALUE:
- * Returns 1 if
- * a) something new arrived and it's got eotsdu_reached bit on,
- * b) this arrival was caused other out-of-sequence things to be
+ * Returns 1 if
+ * a) something new arrived and it's got eotsdu_reached bit on,
+ * b) this arrival was caused other out-of-sequence things to be
* accepted, or
- * c) this arrival is the highest seq # for which we last gave credit
+ * c) this arrival is the highest seq # for which we last gave credit
* (sender just sent a whole window)
- * In other words, returns 1 if tp should send an ack immediately, 0 if
+ * In other words, returns 1 if tp should send an ack immediately, 0 if
* the ack can wait a while.
*
* Note: this implementation no longer renegs on credit, (except
* when debugging option D_RENEG is on, for the purpose of testing
- * ack subsequencing), so we don't need to check for incoming tpdus
+ * ack subsequencing), so we don't need to check for incoming tpdus
* being in a reneged portion of the window.
*/
+int
tp_stash(tpcb, e)
- register struct tp_pcb *tpcb;
- register struct tp_event *e;
+ register struct tp_pcb *tpcb;
+ register struct tp_event *e;
{
- register int ack_reason= tpcb->tp_ack_strat & ACK_STRAT_EACH;
- /* 0--> delay acks until full window */
- /* 1--> ack each tpdu */
-#ifndef lint
-#define E e->ATTR(DT_TPDU)
-#else /* lint */
-#define E e->ev_union.EV_DT_TPDU
-#endif /* lint */
-
- if ( E.e_eot ) {
+ register int ack_reason = tpcb->tp_ack_strat & ACK_STRAT_EACH;
+ /* 0--> delay acks until full window */
+ /* 1--> ack each tpdu */
+#define E e->TPDU_ATTR(DT)
+
+ if (E.e_eot) {
register struct mbuf *n = E.e_data;
n->m_flags |= M_EOR;
n->m_act = 0;
}
- IFDEBUG(D_STASH)
- dump_mbuf(tpcb->tp_sock->so_rcv.sb_mb,
- "stash: so_rcv before appending");
- dump_mbuf(E.e_data,
- "stash: e_data before appending");
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_STASH]) {
+ dump_mbuf(tpcb->tp_sock->so_rcv.sb_mb,
+ "stash: so_rcv before appending");
+ dump_mbuf(E.e_data,
+ "stash: e_data before appending");
+ }
+#endif
- IFPERF(tpcb)
+#ifdef TP_PERF_MEAS
+ if (DOPERF(tpcb)) {
PStat(tpcb, Nb_from_ll) += E.e_datalen;
- tpmeas(tpcb->tp_lref, TPtime_from_ll, &e->e_time,
- E.e_seq, (u_int)PStat(tpcb, Nb_from_ll), (u_int)E.e_datalen);
- ENDPERF
+ tpmeas(tpcb->tp_lref, TPtime_from_ll,
+ &e->e_time, E.e_seq,
+ (u_int) PStat(tpcb, Nb_from_ll),
+ (u_int) E.e_datalen);
+ }
+#endif
if (E.e_seq == tpcb->tp_rcvnxt) {
- IFDEBUG(D_STASH)
- printf("stash EQ: seq 0x%x datalen 0x%x eot 0x%x\n",
- E.e_seq, E.e_datalen, E.e_eot);
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_STASH]) {
+ printf("stash EQ: seq 0x%x datalen 0x%x eot 0x%x\n",
+ E.e_seq, E.e_datalen, E.e_eot);
+ }
+#endif
- IFTRACE(D_STASH)
- tptraceTPCB(TPPTmisc, "stash EQ: seq len eot",
- E.e_seq, E.e_datalen, E.e_eot, 0);
- ENDTRACE
+#ifdef TPPT
+ if (tp_traceflags[D_STASH]) {
+ tptraceTPCB(TPPTmisc, "stash EQ: seq len eot",
+ E.e_seq, E.e_datalen, E.e_eot, 0);
+ }
+#endif
SET_DELACK(tpcb);
sbappend(&tpcb->tp_sock->so_rcv, E.e_data);
- SEQ_INC( tpcb, tpcb->tp_rcvnxt );
- /*
+ SEQ_INC(tpcb, tpcb->tp_rcvnxt);
+ /*
* move chains from the reassembly queue to the socket buffer
*/
if (tpcb->tp_rsycnt) {
register struct mbuf **mp;
- struct mbuf **mplim;
+ struct mbuf **mplim;
- mp = tpcb->tp_rsyq + (tpcb->tp_rcvnxt % tpcb->tp_maxlcredit);
+ mp = tpcb->tp_rsyq + (tpcb->tp_rcvnxt %
+ tpcb->tp_maxlcredit);
mplim = tpcb->tp_rsyq + tpcb->tp_maxlcredit;
while (tpcb->tp_rsycnt && *mp) {
mp = tpcb->tp_rsyq;
}
}
- IFDEBUG(D_STASH)
- dump_mbuf(tpcb->tp_sock->so_rcv.sb_mb,
- "stash: so_rcv after appending");
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_STASH]) {
+ dump_mbuf(tpcb->tp_sock->so_rcv.sb_mb,
+ "stash: so_rcv after appending");
+ }
+#endif
} else {
register struct mbuf **mp;
- SeqNum uwe;
+ SeqNum uwe;
- IFTRACE(D_STASH)
- tptraceTPCB(TPPTmisc, "stash Reseq: seq rcvnxt lcdt",
- E.e_seq, tpcb->tp_rcvnxt, tpcb->tp_lcredit, 0);
- ENDTRACE
+#ifdef TPPT
+ if (tp_traceflags[D_STASH]) {
+ tptraceTPCB(TPPTmisc, "stash Reseq: seq rcvnxt lcdt",
+ E.e_seq, tpcb->tp_rcvnxt,
+ tpcb->tp_lcredit, 0);
+ }
+#endif
if (tpcb->tp_rsyq == 0)
tp_rsyset(tpcb);
uwe = SEQ(tpcb, tpcb->tp_rcvnxt + tpcb->tp_maxlcredit);
if (tpcb->tp_rsyq == 0 ||
- !IN_RWINDOW(tpcb, E.e_seq, tpcb->tp_rcvnxt, uwe)) {
+ !IN_RWINDOW(tpcb, E.e_seq, tpcb->tp_rcvnxt, uwe)) {
ack_reason = ACK_DONT;
m_freem(E.e_data);
- } else if (*(mp = tpcb->tp_rsyq + (E.e_seq % tpcb->tp_maxlcredit))) {
- IFDEBUG(D_STASH)
+ } else if (*(mp = tpcb->tp_rsyq +
+ (E.e_seq % tpcb->tp_maxlcredit)) != NULL ) {
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_STASH]) {
printf("tp_stash - drop & ack\n");
- ENDDEBUG
+ }
+#endif
- /* retransmission - drop it and force an ack */
+ /*
+ * retransmission - drop it and force
+ * an ack
+ */
IncStat(ts_dt_dup);
- IFPERF(tpcb)
+#ifdef TP_PERF_MEAS
+ if (DOPERF(tpcb)) {
IncPStat(tpcb, tps_n_ack_cuz_dup);
- ENDPERF
+ }
+#endif
- m_freem(E.e_data);
+ m_freem(E.e_data);
ack_reason |= ACK_DUP;
} else {
*mp = E.e_data;
ack_reason = ACK_DONT;
}
}
- /* there were some comments of historical interest here. */
+ /*
+ * there were some comments of historical interest
+ * here.
+ */
{
LOCAL_CREDIT(tpcb);
- if ( E.e_seq == tpcb->tp_sent_uwe )
+ if (E.e_seq == tpcb->tp_sent_uwe)
ack_reason |= ACK_STRAT_FULLWIN;
- IFTRACE(D_STASH)
- tptraceTPCB(TPPTmisc,
- "end of stash, eot, ack_reason, sent_uwe ",
- E.e_eot, ack_reason, tpcb->tp_sent_uwe, 0);
- ENDTRACE
+#ifdef TPPT
+ if (tp_traceflags[D_STASH]) {
+ tptraceTPCB(TPPTmisc,
+ "end of stash, eot, ack_reason, sent_uwe ",
+ E.e_eot, ack_reason, tpcb->tp_sent_uwe, 0);
+ }
+#endif
- if ( ack_reason == ACK_DONT ) {
- IncStat( ts_ackreason[ACK_DONT] );
+ if (ack_reason == ACK_DONT) {
+ IncStat(ts_ackreason[ACK_DONT]);
return 0;
} else {
- IFPERF(tpcb)
- if(ack_reason & ACK_STRAT_EACH) {
- IncPStat(tpcb, tps_n_ack_cuz_strat);
- } else if(ack_reason & ACK_STRAT_FULLWIN) {
- IncPStat(tpcb, tps_n_ack_cuz_fullwin);
- } else if(ack_reason & ACK_REORDER) {
- IncPStat(tpcb, tps_n_ack_cuz_reorder);
- }
- tpmeas(tpcb->tp_lref, TPtime_ack_sent, 0,
- SEQ_ADD(tpcb, E.e_seq, 1), 0, 0);
- ENDPERF
+#ifdef TP_PERF_MEAS
+ if (DOPERF(tpcb)) {
+ if (ack_reason & ACK_STRAT_EACH) {
+ IncPStat(tpcb, tps_n_ack_cuz_strat);
+ } else if (ack_reason & ACK_STRAT_FULLWIN) {
+ IncPStat(tpcb, tps_n_ack_cuz_fullwin);
+ } else if (ack_reason & ACK_REORDER) {
+ IncPStat(tpcb, tps_n_ack_cuz_reorder);
+ }
+ tpmeas(tpcb->tp_lref, TPtime_ack_sent, 0,
+ SEQ_ADD(tpcb, E.e_seq, 1), 0, 0);
+ }
+#endif
{
- register int i;
-
- /* keep track of all reasons that apply */
- for( i=1; i<_ACK_NUM_REASONS_ ;i++) {
- if( ack_reason & (1<<i) )
- IncStat( ts_ackreason[i] );
+ register int i;
+
+ /*
+ * keep track of all reasons
+ * that apply
+ */
+ for (i = 1; i < _ACK_NUM_REASONS_; i++) {
+ if (ack_reason & (1 << i))
+ IncStat(ts_ackreason[i]);
}
}
return 1;
* Do this when closing the socket, or when somebody has changed
* the space avaible in the receive socket (XXX).
*/
+void
tp_rsyflush(tpcb)
-register struct tp_pcb *tpcb;
+ register struct tp_pcb *tpcb;
{
- register struct mbuf *m, **mp;
+ register struct mbuf **mp;
if (tpcb->tp_rsycnt) {
- for (mp == tpcb->tp_rsyq + tpcb->tp_maxlcredit;
- --mp >= tpcb->tp_rsyq; )
+ for (mp = tpcb->tp_rsyq + tpcb->tp_maxlcredit;
+ --mp >= tpcb->tp_rsyq;)
if (*mp) {
tpcb->tp_rsycnt--;
m_freem(*mp);
tpcb->tp_rsycnt = 0;
}
}
- free((caddr_t)tpcb->tp_rsyq, M_PCB);
+ free((caddr_t) tpcb->tp_rsyq, M_PCB);
tpcb->tp_rsyq = 0;
}
+void
tp_rsyset(tpcb)
-register struct tp_pcb *tpcb;
+ register struct tp_pcb *tpcb;
{
register struct socket *so = tpcb->tp_sock;
- int maxcredit = tpcb->tp_xtd_format ? 0xffff : 0xf;
- int old_credit = tpcb->tp_maxlcredit;
- caddr_t rsyq;
+ int maxcredit = tpcb->tp_xtd_format ? 0xffff : 0xf;
+ int old_credit = tpcb->tp_maxlcredit;
+ caddr_t rsyq;
tpcb->tp_maxlcredit = maxcredit = min(maxcredit,
- (so->so_rcv.sb_hiwat + tpcb->tp_l_tpdusize)/ tpcb->tp_l_tpdusize);
+ (so->so_rcv.sb_hiwat + tpcb->tp_l_tpdusize) / tpcb->tp_l_tpdusize);
if (old_credit == tpcb->tp_maxlcredit && tpcb->tp_rsyq != 0)
return;
maxcredit *= sizeof(struct mbuf *);
if (tpcb->tp_rsyq)
tp_rsyflush(tpcb);
- if (rsyq = (caddr_t)malloc(maxcredit, M_PCB, M_NOWAIT))
+ if ((rsyq = (caddr_t) malloc(maxcredit, M_PCB, M_NOWAIT)) != NULL)
bzero(rsyq, maxcredit);
- tpcb->tp_rsyq = (struct mbuf **)rsyq;
+ tpcb->tp_rsyq = (struct mbuf **) rsyq;
}
+
+void
tpsbcheck(tpcb, i)
-struct tp_pcb *tpcb;
+ struct tp_pcb *tpcb;
+ int i;
{
register struct mbuf *n, *m;
- register int len = 0, mbcnt = 0, pktlen;
+ register int len = 0, mbcnt = 0, pktlen;
struct sockbuf *sb = &tpcb->tp_sock->so_snd;
for (n = sb->sb_mb; n; n = n->m_nextpkt) {
if ((n->m_flags & M_PKTHDR) == 0)
panic("tpsbcheck nohdr");
pktlen = len + n->m_pkthdr.len;
- for (m = n; m; m = m->m_next) {
+ for (m = n; m; m = m->m_next) {
len += m->m_len;
mbcnt += MSIZE;
if (m->m_flags & M_EXT)
}
if (len != pktlen) {
printf("test %d; len %d != pktlen %d on mbuf 0x%x\n",
- i, len, pktlen, n);
+ i, len, pktlen, n);
panic("tpsbcheck short");
}
}
if (len != sb->sb_cc || mbcnt != sb->sb_mbcnt) {
printf("test %d: cc %d != %d || mbcnt %d != %d\n", i, len, sb->sb_cc,
- mbcnt, sb->sb_mbcnt);
+ mbcnt, sb->sb_mbcnt);
panic("tpsbcheck");
}
}
-/* $NetBSD: tp_subr2.c,v 1.8 1995/08/16 00:38:58 mycroft Exp $ */
+/* $OpenBSD: tp_subr2.c,v 1.2 1996/03/04 10:36:32 mickey Exp $ */
+/* $NetBSD: tp_subr2.c,v 1.9 1996/02/13 22:12:04 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
/*
* ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison
*/
-/*
- * Some auxiliary routines:
- * tp_protocol_error: required by xebec- called when a combo of state,
- * event, predicate isn't covered for by the transition file.
- * tp_indicate: gives indications(signals) to the user process
- * tp_getoptions: initializes variables that are affected by the options
- * chosen.
+/*
+ * Some auxiliary routines: tp_protocol_error: required by xebec- called when
+ * a combo of state, event, predicate isn't covered for by the transition
+ * file. tp_indicate: gives indications(signals) to the user process
+ * tp_getoptions: initializes variables that are affected by the options
+ * chosen.
*/
-/* this def'n is to cause the expansion of this macro in the
- * routine tp_local_credit :
+/*
+ * this def'n is to cause the expansion of this macro in the routine
+ * tp_local_credit :
*/
#define LOCAL_CREDIT_EXPAND
#include <sys/errno.h>
#include <sys/time.h>
#include <sys/kernel.h>
+#include <sys/queue.h>
+
+#include <net/if.h>
+#include <net/if_types.h>
-#undef MNULL
#include <netiso/argo_debug.h>
#include <netiso/tp_param.h>
#include <netiso/tp_ip.h>
#include <netiso/iso.h>
#include <netiso/iso_errno.h>
#include <netiso/iso_pcb.h>
+#include <netiso/iso_var.h>
#include <netiso/tp_timer.h>
#include <netiso/tp_stat.h>
#include <netiso/tp_tpdu.h>
#include <netiso/tp_seq.h>
#include <netiso/tp_trace.h>
#include <netiso/tp_user.h>
+#include <netiso/tp_var.h>
#include <netiso/cons.h>
+#include <netiso/clnp.h>
+
-#include <net/if.h>
-#include <net/if_types.h>
#ifdef TRUE
+#undef MNULL
#undef FALSE
#undef TRUE
#endif
+
#include <netccitt/x25.h>
#include <netccitt/pk.h>
#include <netccitt/pk_var.h>
+#include <netccitt/pk_extern.h>
-void tp_rsyset();
+#if 0
+static void copyQOSparms __P((struct tp_conn_param *, struct tp_conn_param *));
+#endif
+#if 0
+static void pk_flowcontrol __P((struct pklcd *, int, int));
+#endif
/*
* NAME: tp_local_credit()
* SIDE EFFECTS:
*
* NOTES:
- * This doesn't actually get called in a production system -
+ * This doesn't actually get called in a production system -
* the macro gets expanded instead in place of calls to this proc.
* But for debugging, we call this and that allows us to add
* debugging messages easily here.
*/
void
tp_local_credit(tpcb)
- struct tp_pcb *tpcb;
+ struct tp_pcb *tpcb;
{
LOCAL_CREDIT(tpcb);
- IFDEBUG(D_CREDIT)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CREDIT]) {
printf("ref 0x%x lcdt 0x%x l_tpdusize 0x%x decbit 0x%x\n",
- tpcb->tp_lref,
- tpcb->tp_lcredit,
- tpcb->tp_l_tpdusize,
- tpcb->tp_decbit,
- tpcb->tp_cong_win
+ tpcb->tp_lref,
+ tpcb->tp_lcredit,
+ tpcb->tp_l_tpdusize,
+ tpcb->tp_decbit,
+ tpcb->tp_cong_win
);
- ENDDEBUG
- IFTRACE(D_CREDIT)
+ }
+#endif
+#ifdef TPPT
+ if (tp_traceflags[D_CREDIT]) {
tptraceTPCB(TPPTmisc,
- "lcdt tpdusz \n",
- tpcb->tp_lcredit, tpcb->tp_l_tpdusize, 0, 0);
- ENDTRACE
+ "lcdt tpdusz \n",
+ tpcb->tp_lcredit, tpcb->tp_l_tpdusize, 0, 0);
+ }
+#endif
}
/*
* a combo of event, state, predicate
*
* FUNCTION and ARGUMENTS:
- * print error mesg
+ * print error mesg
*
* RETURN VALUE:
* EIO - always
* NOTES:
*/
int
-tp_protocol_error(e,tpcb)
- struct tp_event *e;
- struct tp_pcb *tpcb;
+tp_protocol_error(e, tpcb)
+ struct tp_event *e;
+ struct tp_pcb *tpcb;
{
printf("TP PROTOCOL ERROR! tpcb 0x%x event 0x%x, state 0x%x\n",
- tpcb, e->ev_number, tpcb->tp_state);
- IFTRACE(D_DRIVER)
+ tpcb, e->ev_number, tpcb->tp_state);
+#ifdef TPPT
+ if (tp_traceflags[D_DRIVER]) {
tptraceTPCB(TPPTmisc, "PROTOCOL ERROR tpcb event state",
- tpcb, e->ev_number, tpcb->tp_state, 0 );
- ENDTRACE
- return EIO; /* for lack of anything better */
+ tpcb, e->ev_number, tpcb->tp_state, 0);
+ }
+#endif
+ return EIO; /* for lack of anything better */
}
void
tp_drain()
{
-
}
* attached to the tpcb.
*
* RETURNS: Rien
- *
+ *
* SIDE EFFECTS:
*
* NOTES:
*/
void
tp_indicate(ind, tpcb, error)
- int ind;
- u_short error;
- register struct tp_pcb *tpcb;
+ int ind;
+ u_short error;
+ register struct tp_pcb *tpcb;
{
register struct socket *so = tpcb->tp_sock;
- IFTRACE(D_INDICATION)
- tptraceTPCB(TPPTindicate, ind, *(u_short *)(tpcb->tp_lsuffix),
- *(u_short *)(tpcb->tp_fsuffix), error,so->so_pgid);
- ENDTRACE
- IFDEBUG(D_INDICATION)
- char *ls, *fs;
- ls = tpcb->tp_lsuffix,
- fs = tpcb->tp_fsuffix,
-
- printf(
-"indicate 0x%x lsuf 0x%02x%02x fsuf 0x%02x%02x err 0x%x noind 0x%x ref 0x%x\n",
- ind,
- *ls, *(ls+1), *fs, *(fs+1),
- error, /*so->so_pgrp,*/
- tpcb->tp_no_disc_indications,
- tpcb->tp_lref);
- ENDDEBUG
+#ifdef TPPT
+ if (tp_traceflags[D_INDICATION]) {
+ tptraceTPCB(TPPTindicate, ind, *(u_short *) (tpcb->tp_lsuffix),
+ *(u_short *) (tpcb->tp_fsuffix), error, so->so_pgid);
+ }
+#endif
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_INDICATION]) {
+ char *ls, *fs;
+ ls = tpcb->tp_lsuffix,
+ fs = tpcb->tp_fsuffix,
+
+ printf(
+ "indicate 0x%x lsuf 0x%02x%02x fsuf 0x%02x%02x err 0x%x noind 0x%x ref 0x%x\n",
+ ind,
+ *ls, *(ls + 1), *fs, *(fs + 1),
+ error, /* so->so_pgrp, */
+ tpcb->tp_no_disc_indications,
+ tpcb->tp_lref);
+ }
+#endif
if (ind == ER_TPDU) {
register struct mbuf *m;
struct tp_disc_reason x;
if ((so->so_state & SS_CANTRCVMORE) == 0 &&
- (m = m_get(M_DONTWAIT, MT_OOBDATA)) != 0) {
+ (m = m_get(M_DONTWAIT, MT_OOBDATA)) != 0) {
x.dr_hdr.cmsg_len = m->m_len = sizeof(x);
x.dr_hdr.cmsg_level = SOL_TRANSPORT;
- x.dr_hdr.cmsg_type= TPOPT_DISC_REASON;
+ x.dr_hdr.cmsg_type = TPOPT_DISC_REASON;
x.dr_reason = error;
*mtod(m, struct tp_disc_reason *) = x;
sbappendrecord(&tpcb->tp_Xrcv, m);
}
so->so_error = error;
- if (ind == T_DISCONNECT) {
+ if (ind == T_DISCONNECT) {
if (error == 0)
so->so_error = ENOTCONN;
- if ( tpcb->tp_no_disc_indications )
+ if (tpcb->tp_no_disc_indications)
return;
}
- IFTRACE(D_INDICATION)
- tptraceTPCB(TPPTmisc, "doing sohasoutofband(so)", so,0,0,0);
- ENDTRACE
+#ifdef TPPT
+ if (tp_traceflags[D_INDICATION]) {
+ tptraceTPCB(TPPTmisc, "doing sohasoutofband(so)", so, 0, 0, 0);
+ }
+#endif
sohasoutofband(so);
}
* NAME : tp_getoptions()
*
* CALLED FROM:
- * tp.trans whenever we go into OPEN state
+ * tp.trans whenever we go into OPEN state
*
* FUNCTION and ARGUMENTS:
* sets the proper flags and values in the tpcb, to control
* the appropriate actions for the given class, options,
* sequence space, etc, etc.
- *
+ *
* RETURNS: Nada
- *
+ *
* SIDE EFFECTS:
*
* NOTES:
*/
void
tp_getoptions(tpcb)
-struct tp_pcb *tpcb;
+ struct tp_pcb *tpcb;
{
- tpcb->tp_seqmask =
- tpcb->tp_xtd_format ? TP_XTD_FMT_MASK : TP_NML_FMT_MASK ;
+ tpcb->tp_seqmask =
+ tpcb->tp_xtd_format ? TP_XTD_FMT_MASK : TP_NML_FMT_MASK;
tpcb->tp_seqbit =
- tpcb->tp_xtd_format ? TP_XTD_FMT_BIT : TP_NML_FMT_BIT ;
+ tpcb->tp_xtd_format ? TP_XTD_FMT_BIT : TP_NML_FMT_BIT;
tpcb->tp_seqhalf = tpcb->tp_seqbit >> 1;
tpcb->tp_dt_ticks =
max(tpcb->tp_dt_ticks, (tpcb->tp_peer_acktime + 2));
tp_rsyset(tpcb);
-
+
}
/*
* Called when a ref is frozen.
*
* FUNCTION and ARGUMENTS:
- * allows the suffix to be reused.
+ * allows the suffix to be reused.
*
* RETURNS: zilch
*
* NOTES:
*/
void
-tp_recycle_tsuffix(tpcb)
- struct tp_pcb *tpcb;
+tp_recycle_tsuffix(v)
+ void *v;
{
- bzero((caddr_t)tpcb->tp_lsuffix, sizeof( tpcb->tp_lsuffix));
- bzero((caddr_t)tpcb->tp_fsuffix, sizeof( tpcb->tp_fsuffix));
+ struct tp_pcb *tpcb = v;
+ bzero((caddr_t) tpcb->tp_lsuffix, sizeof(tpcb->tp_lsuffix));
+ bzero((caddr_t) tpcb->tp_fsuffix, sizeof(tpcb->tp_fsuffix));
tpcb->tp_fsuffixlen = tpcb->tp_lsuffixlen = 0;
- (tpcb->tp_nlproto->nlp_recycle_suffix)(tpcb->tp_npcb);
+ (tpcb->tp_nlproto->nlp_recycle_suffix) (tpcb->tp_npcb);
}
/*
* Congestion window scheme:
* Initial value is 1. ("slow start" as Nagle, et. al. call it)
* For each good ack that arrives, the congestion window is increased
- * by 1 (up to max size of logical infinity, which is to say,
+ * by 1 (up to max size of logical infinity, which is to say,
* it doesn't wrap around).
* Source quench causes it to drop back to 1.
- * tp_send() uses the smaller of (regular window, congestion window).
- * One retransmission strategy option is to have any retransmission
+ * tp_send() uses the smaller of (regular window, congestion window).
+ * One retransmission strategy option is to have any retransmission
* cause reset the congestion window back to 1.
*
* (cmd) is either PRC_QUENCH: source quench, or
* PRC_QUENCH2: dest. quench (dec bit)
*
* RETURNS:
- *
+ *
* SIDE EFFECTS:
- *
+ *
* NOTES:
*/
void
-tp_quench( tpcb, cmd )
- struct tp_pcb *tpcb;
- int cmd;
+tp_quench(ipcb, cmd)
+ struct inpcb *ipcb;
+ int cmd;
{
- IFDEBUG(D_QUENCH)
+ struct tp_pcb *tpcb = (struct tp_pcb *) ipcb;
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_QUENCH]) {
printf("tp_quench tpcb 0x%x ref 0x%x sufx 0x%x\n",
- tpcb, tpcb->tp_lref, *(u_short *)(tpcb->tp_lsuffix));
+ tpcb, tpcb->tp_lref, *(u_short *) (tpcb->tp_lsuffix));
printf("cong_win 0x%x decbit 0x%x \n",
- tpcb->tp_cong_win, tpcb->tp_decbit);
- ENDDEBUG
- switch(cmd) {
- case PRC_QUENCH:
- tpcb->tp_cong_win = tpcb->tp_l_tpdusize;
- IncStat(ts_quench);
- break;
- case PRC_QUENCH2:
- tpcb->tp_cong_win = tpcb->tp_l_tpdusize; /* might as well quench source also */
- tpcb->tp_decbit = TP_DECBIT_CLEAR_COUNT;
- IncStat(ts_rcvdecbit);
- break;
+ tpcb->tp_cong_win, tpcb->tp_decbit);
+ }
+#endif
+ switch (cmd) {
+ case PRC_QUENCH:
+ tpcb->tp_cong_win = tpcb->tp_l_tpdusize;
+ IncStat(ts_quench);
+ break;
+ case PRC_QUENCH2:
+ /* might as well quench source also */
+ tpcb->tp_cong_win = tpcb->tp_l_tpdusize;
+ tpcb->tp_decbit = TP_DECBIT_CLEAR_COUNT;
+ IncStat(ts_rcvdecbit);
+ break;
}
}
/*
* NAME: tp_netcmd()
*
- * CALLED FROM:
+ * CALLED FROM:
*
- * FUNCTION and ARGUMENTS:
+ * FUNCTION and ARGUMENTS:
*
- * RETURNS:
+ * RETURNS:
*
- * SIDE EFFECTS:
+ * SIDE EFFECTS:
*
- * NOTES:
+ * NOTES:
*/
-tp_netcmd( tpcb, cmd )
- struct tp_pcb *tpcb;
- int cmd;
+void
+tp_netcmd(tpcb, cmd)
+ struct tp_pcb *tpcb;
+ int cmd;
{
#ifdef TPCONS
- struct isopcb *isop;
- struct pklcd *lcp;
+ struct isopcb *isop;
+ struct pklcd *lcp;
if (tpcb->tp_netservice != ISO_CONS)
return;
- isop = (struct isopcb *)tpcb->tp_npcb;
- lcp = (struct pklcd *)isop->isop_chan;
+ isop = (struct isopcb *) tpcb->tp_npcb;
+ lcp = (struct pklcd *) isop->isop_chan;
switch (cmd) {
case CONN_CLOSE:
case CONN_REFUSE:
if (isop->isop_refcnt == 1) {
- /* This is really superfluous, since it would happen
- anyway in iso_pcbdetach, although it is a courtesy
- to free up the x.25 channel before the refwait timer
- expires. */
+ /*
+ * This is really superfluous, since it would happen
+ * anyway in iso_pcbdetach, although it is a courtesy
+ * to free up the x.25 channel before the refwait
+ * timer expires.
+ */
lcp->lcd_upper = 0;
lcp->lcd_upnext = 0;
pk_disconnect(lcp);
printf("tp_netcmd(0x%x, 0x%x) NOT IMPLEMENTED\n", tpcb, cmd);
break;
}
-#else /* TPCONS */
+#else /* TPCONS */
printf("tp_netcmd(): X25 NOT CONFIGURED!!\n");
#endif
}
+
/*
* CALLED FROM:
* tp_ctloutput() and tp_emit()
* FUNCTION and ARGUMENTS:
* Convert a class mask to the highest numeric value it represents.
*/
-
int
tp_mask_to_num(x)
- u_char x;
+ u_char x;
{
- register int j;
+ register int j;
- for(j = 4; j>=0 ;j--) {
- if(x & (1<<j))
+ for (j = 4; j >= 0; j--) {
+ if (x & (1 << j))
break;
}
- ASSERT( (j == 4) || (j == 0) ); /* for now */
- if( (j != 4) && (j != 0) ) {
+ ASSERT((j == 4) || (j == 0)); /* for now */
+ if ((j != 4) && (j != 0)) {
printf("ASSERTION ERROR: tp_mask_to_num: x 0x%x j %d\n",
- x, j);
+ x, j);
}
- IFTRACE(D_TPINPUT)
+#ifdef TPPT
+ if (tp_traceflags[D_TPINPUT]) {
tptrace(TPPTmisc, "tp_mask_to_num(x) returns j", x, j, 0, 0);
- ENDTRACE
- IFDEBUG(D_TPINPUT)
+ }
+#endif
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TPINPUT]) {
printf("tp_mask_to_num(0x%x) returns 0x%x\n", x, j);
- ENDDEBUG
+ }
+#endif
return j;
}
-static
+#if 0
+static void
copyQOSparms(src, dst)
struct tp_conn_param *src, *dst;
{
/* copy all but the bits stuff at the end */
#define COPYSIZE (12 * sizeof(short))
- bcopy((caddr_t)src, (caddr_t)dst, COPYSIZE);
+ bcopy((caddr_t) src, (caddr_t) dst, COPYSIZE);
dst->p_tpdusize = src->p_tpdusize;
dst->p_ack_strat = src->p_ack_strat;
dst->p_rx_strat = src->p_rx_strat;
#undef COPYSIZE
}
+#endif
+
/*
* Determine a reasonable value for maxseg size.
* If the route is known, check route for mtu.
void
tp_mss(tpcb, nhdr_size)
register struct tp_pcb *tpcb;
- int nhdr_size;
+ int nhdr_size;
{
register struct rtentry *rt;
- struct ifnet *ifp;
- register int rtt, mss;
- u_long bufsize;
- int i, ssthresh = 0, rt_mss;
- struct socket *so;
+ struct ifnet *ifp;
+ register int rtt, mss;
+ u_long bufsize;
+ int i, ssthresh = 0, rt_mss;
+ struct socket *so;
if (tpcb->tp_ptpdusize)
mss = tpcb->tp_ptpdusize << 7;
}
ifp = rt->rt_ifp;
-#ifdef RTV_MTU /* if route characteristics exist ... */
+#ifdef RTV_MTU /* if route characteristics exist ... */
/*
* While we're here, check if there's an initial rtt
* or rttvar. Convert from the route-table units
tpcb->tp_rtt = rtt * hz / RTM_RTTUNIT;
if (rt->rt_rmx.rmx_rttvar)
tpcb->tp_rtv = rt->rt_rmx.rmx_rttvar
- * hz / RTM_RTTUNIT;
+ * hz / RTM_RTTUNIT;
else
tpcb->tp_rtv = tpcb->tp_rtt;
}
if (rt->rt_rmx.rmx_mtu)
rt_mss = rt->rt_rmx.rmx_mtu - nhdr_size;
else
-#endif /* RTV_MTU */
+#endif /* RTV_MTU */
rt_mss = (ifp->if_mtu - nhdr_size);
- if (tpcb->tp_ptpdusize == 0 || /* assume application doesn't care */
- mss > rt_mss /* network won't support what was asked for */)
+ if (tpcb->tp_ptpdusize == 0 || /* assume application doesn't care */
+ mss > rt_mss /* network won't support what was asked for */ )
mss = rt_mss;
/* can propose mtu which are multiples of 128 */
mss &= ~0x7f;
* signal packet loss by duplicate acks.
*/
mss = min(mss, bufsize >> 2) & ~0x7f;
- mss = max(mss, 128); /* sanity */
+ mss = max(mss, 128); /* sanity */
tpcb->tp_cong_win =
(rt == 0 || (rt->rt_flags & RTF_GATEWAY)) ? mss : bufsize;
tpcb->tp_l_tpdusize = mss;
break;
i--;
tpcb->tp_tpdusize = i;
-#endif /* RTV_MTU */
+#endif /* RTV_MTU */
}
/*
* CALLED FROM:
* tp_usrreq on PRU_CONNECT and tp_input on receipt of CR
- *
+ *
* FUNCTION and ARGUMENTS:
* -- An mbuf containing the peer's network address.
* -- Our control block, which will be modified
* -- In the case of cons, a control block for that layer.
*
- *
+ *
* RETURNS:
- * errno value :
+ * errno value :
* EAFNOSUPPORT if can't find an nl_protosw for x.25 (really could panic)
* ECONNREFUSED if trying to run TP0 with non-type 37 address
* possibly other E* returned from cons_netcmd()
* based on information cached on the route.
*/
int
-tp_route_to( m, tpcb, channel)
- struct mbuf *m;
- register struct tp_pcb *tpcb;
- caddr_t channel;
+tp_route_to(m, tpcb, channel)
+ struct mbuf *m;
+ register struct tp_pcb *tpcb;
+ caddr_t channel;
{
- register struct sockaddr_iso *siso; /* NOTE: this may be a sockaddr_in */
- extern struct tp_conn_param tp_conn_param[];
- int error = 0, save_netservice = tpcb->tp_netservice;
+ register struct sockaddr_iso *siso; /* NOTE: this may be a
+ * sockaddr_in */
+ int error = 0, save_netservice = tpcb->tp_netservice;
register struct rtentry *rt = 0;
- int nhdr_size, mtu, bufsize;
+ int nhdr_size;
siso = mtod(m, struct sockaddr_iso *);
- IFTRACE(D_CONN)
- tptraceTPCB(TPPTmisc,
- "route_to: so afi netservice class",
- tpcb->tp_sock, siso->siso_addr.isoa_genaddr[0], tpcb->tp_netservice,
- tpcb->tp_class);
- ENDTRACE
- IFDEBUG(D_CONN)
- printf("tp_route_to( m x%x, channel 0x%x, tpcb 0x%x netserv 0x%x)\n",
- m, channel, tpcb, tpcb->tp_netservice);
+#ifdef TPPT
+ if (tp_traceflags[D_CONN]) {
+ tptraceTPCB(TPPTmisc,
+ "route_to: so afi netservice class",
+ tpcb->tp_sock, siso->siso_addr.isoa_genaddr[0], tpcb->tp_netservice,
+ tpcb->tp_class);
+ }
+#endif
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
+ printf("tp_route_to( m x%x, channel 0x%x, tpcb 0x%x netserv 0x%x)\n",
+ m, channel, tpcb, tpcb->tp_netservice);
printf("m->mlen x%x, m->m_data:\n", m->m_len);
dump_buf(mtod(m, caddr_t), m->m_len);
- ENDDEBUG
+ }
+#endif
if (channel) {
#ifdef TPCONS
- struct pklcd *lcp = (struct pklcd *)channel;
- struct isopcb *isop = (struct isopcb *)lcp->lcd_upnext,
- *isop_new = (struct isopcb *)tpcb->tp_npcb;
- /* The next 2 lines believe that you haven't
- set any network level options or done a pcbconnect
- and XXXXXXX'edly apply to both inpcb's and isopcb's */
+ struct pklcd *lcp = (struct pklcd *) channel;
+ struct isopcb *isop = (struct isopcb *) lcp->lcd_upnext,
+ *isop_new = (struct isopcb *) tpcb->tp_npcb;
+ /*
+ * The next 2 lines believe that you haven't set any network
+ * level options or done a pcbconnect and XXXXXXX'edly apply
+ * to both inpcb's and isopcb's
+ */
remque(isop_new);
free(isop_new, M_PCB);
- tpcb->tp_npcb = (caddr_t)isop;
+ tpcb->tp_npcb = (caddr_t) isop;
tpcb->tp_netservice = ISO_CONS;
tpcb->tp_nlproto = nl_protosw + ISO_CONS;
if (isop->isop_refcnt++ == 0) {
- iso_putsufx(isop, tpcb->tp_lsuffix, tpcb->tp_lsuffixlen, TP_LOCAL);
+ iso_putsufx(isop, tpcb->tp_lsuffix,
+ tpcb->tp_lsuffixlen, TP_LOCAL);
isop->isop_socket = tpcb->tp_sock;
- } else
- /* there are already connections sharing this */;
+ }
#endif
} else {
switch (siso->siso_family) {
goto done;
#ifdef ISO
case AF_ISO:
- {
- struct isopcb *isop = (struct isopcb *)tpcb->tp_npcb;
- int flags = tpcb->tp_sock->so_options & SO_DONTROUTE;
- tpcb->tp_netservice = ISO_CLNS;
- if (clnp_route(&siso->siso_addr, &isop->isop_route,
- flags, (void **)0, (void **)0) == 0) {
- rt = isop->isop_route.ro_rt;
- if (rt && rt->rt_flags & RTF_PROTO1)
- tpcb->tp_netservice = ISO_CONS;
- }
- } break;
+ {
+ struct isopcb *isop = (struct isopcb *) tpcb->tp_npcb;
+ int flags = tpcb->tp_sock->so_options & SO_DONTROUTE;
+ tpcb->tp_netservice = ISO_CLNS;
+ if (clnp_route(&siso->siso_addr, &isop->isop_route,
+ flags, NULL, NULL) == 0) {
+ rt = isop->isop_route.ro_rt;
+ if (rt && rt->rt_flags & RTF_PROTO1)
+ tpcb->tp_netservice = ISO_CONS;
+ }
+ } break;
#endif
#ifdef INET
case AF_INET:
#endif
}
if (tpcb->tp_nlproto->nlp_afamily != siso->siso_family) {
- IFDEBUG(D_CONN)
- printf("tp_route_to( CHANGING nlproto old 0x%x new 0x%x)\n",
- save_netservice, tpcb->tp_netservice);
- ENDDEBUG
- if (error = tp_set_npcb(tpcb))
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
+ printf("tp_route_to( CHANGING nlproto old 0x%x new 0x%x)\n",
+ save_netservice, tpcb->tp_netservice);
+ }
+#endif
+ if ((error = tp_set_npcb(tpcb)) != 0)
goto done;
}
- IFDEBUG(D_CONN)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
printf("tp_route_to calling nlp_pcbconn, netserv %d\n",
- tpcb->tp_netservice);
- ENDDEBUG
+ tpcb->tp_netservice);
+ }
+#endif
tpcb->tp_nlproto = nl_protosw + tpcb->tp_netservice;
- error = (tpcb->tp_nlproto->nlp_pcbconn)(tpcb->tp_npcb, m);
+ error = (*tpcb->tp_nlproto->nlp_pcbconn) (tpcb->tp_npcb, m);
}
if (error)
goto done;
- nhdr_size = tpcb->tp_nlproto->nlp_mtu(tpcb); /* only gets common info */
+ /* only gets common info */
+ nhdr_size = (*tpcb->tp_nlproto->nlp_mtu)(tpcb);
tp_mss(tpcb, nhdr_size);
done:
- IFDEBUG(D_CONN)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
printf("tp_route_to returns 0x%x\n", error);
- ENDDEBUG
- IFTRACE(D_CONN)
- tptraceTPCB(TPPTmisc, "route_to: returns: error netserv class", error,
- tpcb->tp_netservice, tpcb->tp_class, 0);
- ENDTRACE
+ }
+#endif
+#ifdef TPPT
+ if (tp_traceflags[D_CONN]) {
+ tptraceTPCB(TPPTmisc, "route_to: returns: error netserv class", error,
+ tpcb->tp_netservice, tpcb->tp_class, 0);
+ }
+#endif
return error;
}
-#ifndef TPCONS
+#if 0
static
-pk_flowcontrol() {}
+void
+pk_flowcontrol(lcp, foo, bar)
+ struct pklcd *lcp;
+ int foo, bar;
+{
+}
#endif
/* class zero version */
void
-tp0_stash( tpcb, e )
- register struct tp_pcb *tpcb;
- register struct tp_event *e;
+tp0_stash(tpcb, e)
+ register struct tp_pcb *tpcb;
+ register struct tp_event *e;
{
-#ifndef lint
-#define E e->ATTR(DT_TPDU)
-#else /* lint */
-#define E e->ev_union.EV_DT_TPDU
-#endif /* lint */
+#define E e->TPDU_ATTR(DT)
register struct sockbuf *sb = &tpcb->tp_sock->so_rcv;
- register struct isopcb *isop = (struct isopcb *)tpcb->tp_npcb;
+ register struct isopcb *isop = (struct isopcb *) tpcb->tp_npcb;
- IFPERF(tpcb)
+#ifdef TP_PERF_MEAS
+ if (DOPERF(tpcb)) {
PStat(tpcb, Nb_from_ll) += E.e_datalen;
- tpmeas(tpcb->tp_lref, TPtime_from_ll, &e->e_time,
- E.e_seq, PStat(tpcb, Nb_from_ll), E.e_datalen);
- ENDPERF
+ tpmeas(tpcb->tp_lref, TPtime_from_ll, &e->e_time,
+ E.e_seq, PStat(tpcb, Nb_from_ll), E.e_datalen);
+ }
+#endif
- IFDEBUG(D_STASH)
- printf("stash EQ: seq 0x%x datalen 0x%x eot 0x%x",
- E.e_seq, E.e_datalen, E.e_eot);
- ENDDEBUG
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_STASH]) {
+ printf("stash EQ: seq 0x%x datalen 0x%x eot 0x%x",
+ E.e_seq, E.e_datalen, E.e_eot);
+ }
+#endif
- IFTRACE(D_STASH)
- tptraceTPCB(TPPTmisc, "stash EQ: seq len eot",
- E.e_seq, E.e_datalen, E.e_eot, 0);
- ENDTRACE
+#ifdef TPPT
+ if (tp_traceflags[D_STASH]) {
+ tptraceTPCB(TPPTmisc, "stash EQ: seq len eot",
+ E.e_seq, E.e_datalen, E.e_eot, 0);
+ }
+#endif
- if ( E.e_eot ) {
+ if (E.e_eot) {
register struct mbuf *n = E.e_data;
n->m_flags |= M_EOR;
- n->m_act = MNULL; /* set on tp_input */
+ n->m_act = NULL; /* set on tp_input */
}
sbappend(sb, E.e_data);
- IFDEBUG(D_STASH)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_STASH]) {
dump_mbuf(sb->sb_mb, "stash 0: so_rcv after appending");
- ENDDEBUG
+ }
+#endif
if (tpcb->tp_netservice != ISO_CONS)
printf("tp0_stash: tp running over something wierd\n");
else {
- register struct pklcd *lcp = (struct pklcd *)isop->isop_chan;
+ register struct pklcd *lcp = (struct pklcd *) isop->isop_chan;
pk_flowcontrol(lcp, sbspace(sb) <= 0, 1);
}
-}
+}
void
tp0_openflow(tpcb)
-register struct tp_pcb *tpcb;
+ register struct tp_pcb *tpcb;
{
- register struct isopcb *isop = (struct isopcb *)tpcb->tp_npcb;
+ register struct isopcb *isop = (struct isopcb *) tpcb->tp_npcb;
if (tpcb->tp_netservice != ISO_CONS)
printf("tp0_openflow: tp running over something wierd\n");
else {
- register struct pklcd *lcp = (struct pklcd *)isop->isop_chan;
+ register struct pklcd *lcp = (struct pklcd *) isop->isop_chan;
if (lcp->lcd_rxrnr_condition)
pk_flowcontrol(lcp, 0, 0);
}
/*
* CALLED FROM:
* tp_ctloutput() when the user sets TPOPT_PERF_MEAS on
- * and tp_newsocket() when a new connection is made from
+ * and tp_newsocket() when a new connection is made from
* a listening socket with tp_perf_on == true.
* FUNCTION and ARGUMENTS:
* (tpcb) is the usual; this procedure gets a clear cluster mbuf for
* ENOBUFS if it cannot get a cluster mbuf.
*/
-int
+int
tp_setup_perf(tpcb)
register struct tp_pcb *tpcb;
{
-
- if( tpcb->tp_p_meas == 0 ) {
+ if (tpcb->tp_p_meas == 0) {
tpcb->tp_p_meas = malloc(sizeof(struct tp_pmeas), M_PCB, M_WAITOK);
bzero((caddr_t)tpcb->tp_p_meas, sizeof(struct tp_pmeas));
- IFDEBUG(D_PERF_MEAS)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_PERF_MEAS]) {
printf(
- "tpcb 0x%x so 0x%x ref 0x%x tp_p_meas 0x%x tp_perf_on 0x%x\n",
- tpcb, tpcb->tp_sock, tpcb->tp_lref,
- tpcb->tp_p_meas, tpcb->tp_perf_on);
- ENDDEBUG
+ "tpcb 0x%x so 0x%x ref 0x%x tp_p_meas 0x%x tp_perf_on 0x%x\n",
+ tpcb, tpcb->tp_sock, tpcb->tp_lref,
+ tpcb->tp_p_meas, tpcb->tp_perf_on);
+ }
+#endif
tpcb->tp_perf_on = 1;
}
return 0;
}
-#endif /* TP_PERF_MEAS */
+#endif /* TP_PERF_MEAS */
#ifdef ARGO_DEBUG
-dump_addr (addr)
+void
+dump_addr(addr)
register struct sockaddr *addr;
{
- switch( addr->sa_family ) {
- case AF_INET:
- dump_inaddr(satosin(addr));
- break;
+ switch (addr->sa_family) {
+ case AF_INET:
+ dump_inaddr(satosin(addr));
+ break;
#ifdef ISO
- case AF_ISO:
- dump_isoaddr(satosiso(addr));
- break;
-#endif /* ISO */
- default:
- printf("BAD AF: 0x%x\n", addr->sa_family);
- break;
+ case AF_ISO:
+ dump_isoaddr(satosiso(addr));
+ break;
+#endif /* ISO */
+ default:
+ printf("BAD AF: 0x%x\n", addr->sa_family);
+ break;
}
}
* columns of hex/dec numbers will be printed, followed by the
* character representations (if printable).
*/
+void
Dump_buf(buf, len)
-caddr_t buf;
-int len;
+ caddr_t buf;
+ int len;
{
- int i,j;
+ int i, j;
#define Buf ((u_char *)buf)
printf("Dump buf 0x%x len 0x%x\n", buf, len);
for (i = 0; i < len; i += MAX_COLUMNS) {
printf("+%d:\t", i);
for (j = 0; j < MAX_COLUMNS; j++) {
if (i + j < len) {
- printf("%x/%d\t", Buf[i+j], Buf[i+j]);
+ printf("%x/%d\t", Buf[i + j], Buf[i + j]);
} else {
printf(" ");
}
for (j = 0; j < MAX_COLUMNS; j++) {
if (i + j < len) {
- if (((Buf[i+j]) > 31) && ((Buf[i+j]) < 128))
- printf("%c", Buf[i+j]);
+ if (((Buf[i + j]) > 31) && ((Buf[i + j]) < 128))
+ printf("%c", Buf[i + j]);
else
printf(".");
}
-/* $NetBSD: tp_timer.c,v 1.6 1995/08/12 23:59:51 mycroft Exp $ */
+/* $OpenBSD: tp_timer.c,v 1.2 1996/03/04 10:36:34 mickey Exp $ */
+/* $NetBSD: tp_timer.c,v 1.7 1996/02/13 22:12:10 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
#include <netiso/tp_tpdu.h>
#include <netiso/tp_trace.h>
#include <netiso/tp_seq.h>
+#include <netiso/tp_var.h>
-struct tp_ref *tp_ref;
-int tp_rttdiv, tp_rttadd, N_TPREF = 127;
-struct tp_refinfo tp_refinfo;
-struct tp_pcb *tp_ftimeolist = (struct tp_pcb *)&tp_ftimeolist;
+struct tp_ref *tp_ref;
+int tp_rttdiv, tp_rttadd, N_TPREF = 127;
+struct tp_refinfo tp_refinfo;
+struct tp_pcb *tp_ftimeolist = (struct tp_pcb *) & tp_ftimeolist;
/*
* CALLED FROM:
- * at autoconfig time from tp_init()
+ * at autoconfig time from tp_init()
* a combo of event, state, predicate
* FUNCTION and ARGUMENTS:
* initialize data structures for the timers
void
tp_timerinit()
{
- register int s;
+ register int s;
/*
* Initialize storage
*/
if (tp_refinfo.tpr_base)
return;
- tp_refinfo.tpr_size = N_TPREF + 1; /* Need to start somewhere */
+ tp_refinfo.tpr_size = N_TPREF + 1; /* Need to start somewhere */
s = sizeof(*tp_ref) * tp_refinfo.tpr_size;
if ((tp_ref = (struct tp_ref *) malloc(s, M_PCB, M_NOWAIT)) == 0)
panic("tp_timerinit");
- bzero((caddr_t)tp_ref, (unsigned) s);
+ bzero((caddr_t) tp_ref, (unsigned) s);
tp_refinfo.tpr_base = tp_ref;
tp_rttdiv = hz / PR_SLOWHZ;
tp_rttadd = (2 * tp_rttdiv) - 1;
*/
void
tp_etimeout(tpcb, fun, ticks)
- register struct tp_pcb *tpcb;
- int fun; /* function to be called */
- int ticks;
+ register struct tp_pcb *tpcb;
+ int fun; /* function to be called */
+ int ticks;
{
register u_int *callp;
- IFDEBUG(D_TIMER)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TIMER]) {
printf("etimeout pcb 0x%x state 0x%x\n", tpcb, tpcb->tp_state);
- ENDDEBUG
- IFTRACE(D_TIMER)
+ }
+#endif
+#ifdef TPPT
+ if (tp_traceflags[D_TIMER]) {
tptrace(TPPTmisc, "tp_etimeout ref refstate tks Etick", tpcb->tp_lref,
- tpcb->tp_state, ticks, tp_stat.ts_Eticks);
- ENDTRACE
+ tpcb->tp_state, ticks, tp_stat.ts_Eticks);
+ }
+#endif
if (tpcb == 0)
return;
IncStat(ts_Eset);
*/
void
tp_euntimeout(tpcb, fun)
- register struct tp_pcb *tpcb;
- int fun;
+ register struct tp_pcb *tpcb;
+ int fun;
{
- IFTRACE(D_TIMER)
+#ifdef TPPT
+ if (tp_traceflags[D_TIMER]) {
tptrace(TPPTmisc, "tp_euntimeout ref", tpcb->tp_lref, 0, 0, 0);
- ENDTRACE
+ }
+#endif
if (tpcb)
tpcb->tp_timer[fun] = 0;
void
tp_slowtimo()
{
- register u_int *cp;
- register struct tp_ref *rp;
- struct tp_pcb *tpcb;
- struct tp_event E;
- int s = splsoftnet(), t;
+ register u_int *cp;
+ register struct tp_ref *rp;
+ struct tp_pcb *tpcb;
+ struct tp_event E;
+ int s = splsoftnet(), t;
/* check only open reference structures */
IncStat(ts_Cticks);
/* tp_ref[0] is never used */
for (rp = tp_ref + tp_refinfo.tpr_maxopen; rp > tp_ref; rp--) {
- if ((tpcb = rp->tpr_pcb) == 0 || tpcb->tp_refstate < REF_OPEN)
+ if ((tpcb = rp->tpr_pcb) == 0 || tpcb->tp_refstate < REF_OPEN)
continue;
/* check the timers */
for (t = 0; t < TM_NTIMERS; t++) {
cp = tpcb->tp_timer + t;
- if (*cp && --(*cp) <= 0 ) {
+ if (*cp && --(*cp) <= 0) {
*cp = 0;
E.ev_number = t;
- IFDEBUG(D_TIMER)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TIMER]) {
printf("tp_slowtimo: pcb 0x%x t %d\n",
- tpcb, t);
- ENDDEBUG
+ tpcb, t);
+ }
+#endif
IncStat(ts_Cexpired);
tp_driver(tpcb, &E);
if (t == TM_reference && tpcb->tp_state == TP_CLOSED) {
if (tpcb->tp_notdetached) {
- IFDEBUG(D_CONN)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
printf("PRU_DETACH: not detached\n");
- ENDDEBUG
+ }
+#endif
tp_detach(tpcb);
}
/* XXX wart; where else to do it? */
- free((caddr_t)tpcb, M_PCB);
+ free((caddr_t) tpcb, M_PCB);
}
}
}
/*
* Called From: tp.trans from tp_slowtimo() -- retransmission timer went off.
*/
+void
tp_data_retrans(tpcb)
-register struct tp_pcb *tpcb;
+ register struct tp_pcb *tpcb;
{
- int rexmt, win;
+ int rexmt, win;
tpcb->tp_rttemit = 0; /* cancel current round trip time */
tpcb->tp_dupacks = 0;
tpcb->tp_sndnxt = tpcb->tp_snduna;
* bother shrinking the congestion windows, et. al.
* The retransmission timer should have been reset in goodack()
*/
- IFDEBUG(D_ACKRECV)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_ACKRECV]) {
printf("tp_data_retrans: 0 window tpcb 0x%x una 0x%x\n",
- tpcb, tpcb->tp_snduna);
- ENDDEBUG
+ tpcb, tpcb->tp_snduna);
+ }
+#endif
tpcb->tp_rxtshift = 0;
tpcb->tp_timer[TM_data_retrans] = 0;
tpcb->tp_timer[TM_sendack] = tpcb->tp_dt_ticks;
win = max(win, 2);
tpcb->tp_cong_win = tpcb->tp_l_tpdusize; /* slow start again. */
tpcb->tp_ssthresh = win * tpcb->tp_l_tpdusize;
- /* We're losing; our srtt estimate is probably bogus.
- * Clobber it so we'll take the next rtt measurement as our srtt;
- * Maintain current rxt times until then.
+ /*
+ * We're losing; our srtt estimate is probably bogus. Clobber it so
+ * we'll take the next rtt measurement as our srtt; Maintain current
+ * rxt times until then.
*/
if (++tpcb->tp_rxtshift > TP_NRETRANS / 4) {
/* tpcb->tp_nlprotosw->nlp_losing(tpcb->tp_npcb) someday */
tp_fasttimo()
{
register struct tp_pcb *t;
- int s = splsoftnet();
- struct tp_event E;
+ int s = splsoftnet();
+ struct tp_event E;
E.ev_number = TM_sendack;
- while ((t = tp_ftimeolist) != (struct tp_pcb *)&tp_ftimeolist) {
+ while ((t = tp_ftimeolist) != (struct tp_pcb *) & tp_ftimeolist) {
if (t == 0) {
printf("tp_fasttimeo: should panic");
- tp_ftimeolist = (struct tp_pcb *)&tp_ftimeolist;
+ tp_ftimeolist = (struct tp_pcb *) & tp_ftimeolist;
} else {
if (t->tp_flags & TPF_DELACK) {
IncStat(ts_Fdelack);
*/
void
tp_ctimeout(tpcb, which, ticks)
- register struct tp_pcb *tpcb;
- int which, ticks;
+ register struct tp_pcb *tpcb;
+ int which, ticks;
{
- IFTRACE(D_TIMER)
- tptrace(TPPTmisc, "tp_ctimeout ref which tpcb active",
+#ifdef TPPT
+ if (tp_traceflags[D_TIMER]) {
+ tptrace(TPPTmisc, "tp_ctimeout ref which tpcb active",
tpcb->tp_lref, which, tpcb, tpcb->tp_timer[which]);
- ENDTRACE
- if(tpcb->tp_timer[which])
+ }
+#endif
+ if (tpcb->tp_timer[which])
IncStat(ts_Ccan_act);
IncStat(ts_Cset);
if (ticks <= 0)
/*
* CALLED FROM:
- * tp.trans
+ * tp.trans
* FUNCTION and ARGUMENTS:
- * Version of tp_ctimeout that resets the C-type time if the
+ * Version of tp_ctimeout that resets the C-type time if the
* parameter (ticks) is > the current value of the timer.
*/
void
tp_ctimeout_MIN(tpcb, which, ticks)
- register struct tp_pcb *tpcb;
- int which, ticks;
+ register struct tp_pcb *tpcb;
+ int which, ticks;
{
- IFTRACE(D_TIMER)
- tptrace(TPPTmisc, "tp_ctimeout_MIN ref which tpcb active",
+#ifdef TPPT
+ if (tp_traceflags[D_TIMER]) {
+ tptrace(TPPTmisc, "tp_ctimeout_MIN ref which tpcb active",
tpcb->tp_lref, which, tpcb, tpcb->tp_timer[which]);
- ENDTRACE
- IncStat(ts_Cset);
- if (tpcb->tp_timer[which]) {
+ }
+#endif
+ IncStat(ts_Cset);
+ if (tpcb->tp_timer[which]) {
tpcb->tp_timer[which] = min(ticks, tpcb->tp_timer[which]);
IncStat(ts_Ccan_act);
} else
*/
void
tp_cuntimeout(tpcb, which)
- register struct tp_pcb *tpcb;
- int which;
+ register struct tp_pcb *tpcb;
+ int which;
{
- IFDEBUG(D_TIMER)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_TIMER]) {
printf("tp_cuntimeout(0x%x, %d) active %d\n",
- tpcb, which, tpcb->tp_timer[which]);
- ENDDEBUG
+ tpcb, which, tpcb->tp_timer[which]);
+ }
+#endif
- IFTRACE(D_TIMER)
- tptrace(TPPTmisc, "tp_cuntimeout ref which, active", refp-tp_ref,
+#ifdef TPPT
+ if (tp_traceflags[D_TIMER]) {
+ tptrace(TPPTmisc, "tp_cuntimeout ref which, active", refp - tp_ref,
which, tpcb->tp_timer[which], 0);
- ENDTRACE
+ }
+#endif
if (tpcb->tp_timer[which])
IncStat(ts_Ccan_act);
-/* $NetBSD: tp_timer.h,v 1.5 1994/06/29 06:40:40 cgd Exp $ */
+/* $OpenBSD: tp_timer.h,v 1.2 1996/03/04 10:36:36 mickey Exp $ */
+/* $NetBSD: tp_timer.h,v 1.6 1996/02/13 22:12:13 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
/*
* ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison
*/
-/*
+/*
* The callout structures used by the tp timers.
*/
#define tp_euntimeout tp_cuntimeout
#define tp_ctimeout_MIN(p, w, t) \
{ if((p)->tp_timer[w] > (t)) (p)->tp_timer[w] = (t);}
-#endif /* TP_DEBUG_TIMERS */
+#endif /* TP_DEBUG_TIMERS */
-#endif /* _NETISO_TP_TIMER_H_ */
+#endif /* _NETISO_TP_TIMER_H_ */
-/* $NetBSD: tp_tpdu.h,v 1.7 1994/07/21 07:10:12 mycroft Exp $ */
+/* $OpenBSD: tp_tpdu.h,v 1.2 1996/03/04 10:36:38 mickey Exp $ */
+/* $NetBSD: tp_tpdu.h,v 1.8 1996/02/13 22:12:16 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
/*
* ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison
*/
-/*
- * This ghastly set of macros makes it possible to
- * refer to tpdu structures without going mad.
+/*
+ * This ghastly set of macros makes it possible to refer to tpdu structures
+ * without going mad.
*/
#ifndef _NETISO_TP_TPDU_H_
#include <machine/endian.h> /* for BYTE_ORDER */
-/* This much of a tpdu is the same for all types of tpdus (except
- * DT tpdus in class 0; their exceptions are handled by the data
- * structure below
+/*
+ * This much of a tpdu is the same for all types of tpdus (except DT tpdus
+ * in class 0; their exceptions are handled by the data structure below
*/
struct tpdu_fixed {
- u_char _tpduf_li:8, /* length indicator */
+ u_char _tpduf_li:8, /* length indicator */
#if BYTE_ORDER == LITTLE_ENDIAN
- _tpduf_cdt: 4, /* credit */
- _tpduf_type: 4; /* type of tpdu (DT, CR, etc.) */
+ _tpduf_cdt:4, /* credit */
+ _tpduf_type:4; /* type of tpdu (DT, CR, etc.) */
#endif
#if BYTE_ORDER == BIG_ENDIAN
- _tpduf_type: 4, /* type of tpdu (DT, CR, etc.) */
- _tpduf_cdt: 4; /* credit */
+ _tpduf_type:4, /* type of tpdu (DT, CR, etc.) */
+ _tpduf_cdt:4; /* credit */
#endif
- u_short _tpduf_dref; /* destination ref; not in DT in class 0 */
+ u_short _tpduf_dref; /* destination ref; not in DT in
+ * class 0 */
};
#define tpdu_li _tpduf._tpduf_li
#define tpdu_type _tpduf._tpduf_type
#define tpdu_cdt _tpduf._tpduf_cdt
#define tpdu_dref _tpduf._tpduf_dref
-
+
struct tp0du {
- u_char _tp0_li,
- _tp0_cdt_type, /* same as in tpdu_fixed */
+ u_char _tp0_li, _tp0_cdt_type, /* same as in tpdu_fixed */
#if BYTE_ORDER == BIG_ENDIAN
- _tp0_eot: 1, /* eot */
- _tp0_mbz: 7, /* must be zero */
+ _tp0_eot:1, /* eot */
+ _tp0_mbz:7, /* must be zero */
#endif
#if BYTE_ORDER == LITTLE_ENDIAN
- _tp0_mbz: 7, /* must be zero */
- _tp0_eot: 1, /* eot */
+ _tp0_mbz:7, /* must be zero */
+ _tp0_eot:1, /* eot */
#endif
- _tp0_notused: 8; /* data begins on this octet */
+ _tp0_notused:8; /* data begins on this octet */
};
#define tp0du_eot _tp0_eot
#define tp0du_mbz _tp0_mbz
-
+
/*
* This is used when the extended format seqence numbers are
- * being sent and received.
+ * being sent and received.
+ */
+/*
+ * the seqeot field is an int that overlays the seq
+ * and eot fields, this allows the htonl operation
+ * to be applied to the entire 32 bit quantity, and
+ * simplifies the structure definitions.
*/
- /*
- * the seqeot field is an int that overlays the seq
- * and eot fields, this allows the htonl operation
- * to be applied to the entire 32 bit quantity, and
- * simplifies the structure definitions.
- */
union seq_type {
struct {
#if BYTE_ORDER == BIG_ENDIAN
- unsigned int st_eot:1, /* end-of-tsdu */
- st_seq:31; /* 31 bit sequence number */
+ unsigned int st_eot:1, /* end-of-tsdu */
+ st_seq:31; /* 31 bit sequence number */
#endif
#if BYTE_ORDER == LITTLE_ENDIAN
- unsigned int st_seq:31, /* 31 bit sequence number */
- st_eot:1; /* end-of-tsdu */
+ unsigned int st_seq:31, /* 31 bit sequence number */
+ st_eot:1; /* end-of-tsdu */
#endif
} st;
- unsigned int s_seqeot;
+ unsigned int s_seqeot;
#define s_eot st.st_eot
#define s_seq st.st_seq
};
-/* Then most tpdu types have a portion that is always present but
- * differs among the tpdu types :
+/*
+ * Then most tpdu types have a portion that is always present but differs
+ * among the tpdu types :
*/
-union tpdu_fixed_rest {
+union tpdu_fixed_rest {
- struct {
- u_short _tpdufr_sref, /* source reference */
-#if BYTE_ORDER == BIG_ENDIAN
- _tpdufr_class: 4, /* class [ ISO 8073 13.3.3.e ] */
- _tpdufr_opt: 4, /* options [ ISO 8073 13.3.3.e ] */
+ struct {
+ u_short _tpdufr_sref, /* source reference */
+#if BYTE_ORDER == BIG_ENDIAN
+ _tpdufr_class:4, /* class [ISO 8073 13.3.3.e] */
+ _tpdufr_opt:4, /* options [ISO 8073 13.3.3.e] */
#endif
#if BYTE_ORDER == LITTLE_ENDIAN
- _tpdufr_opt: 4, /* options [ ISO 8073 13.3.3.e ] */
- _tpdufr_class: 4, /* class [ ISO 8073 13.3.3.e ] */
+ _tpdufr_opt:4, /* options [ISO 8073 13.3.3.e] */
+ _tpdufr_class:4, /* class [ISO 8073 13.3.3.e] */
#endif
- _tpdufr_xx: 8; /* unused */
- } CRCC;
+ _tpdufr_xx:8; /* unused */
+ } CRCC;
#define tpdu_CRli _tpduf._tpduf_li
#define tpdu_CRtype _tpduf._tpduf_type
#define tpdu_CCclass _tpdufr.CRCC._tpdufr_class
#define tpdu_CCoptions _tpdufr.CRCC._tpdufr_opt
-/* OPTIONS and ADDL OPTIONS bits */
+ /* OPTIONS and ADDL OPTIONS bits */
#define TPO_USE_EFC 0x1
#define TPO_XTD_FMT 0x2
#define TPAO_USE_TXPD 0x1
#define TPAO_USE_RCC 0x4
#define TPAO_USE_NXPD 0x8
- struct {
- unsigned short _tpdufr_sref; /* source reference */
- unsigned char _tpdufr_reason; /* [ ISO 8073 13.5.3.d ] */
- } DR;
+ struct {
+ unsigned short _tpdufr_sref; /* source reference */
+ unsigned char _tpdufr_reason; /* [ ISO 8073 13.5.3.d ] */
+ } DR;
#define tpdu_DRli _tpduf._tpduf_li
#define tpdu_DRtype _tpduf._tpduf_type
#define tpdu_DRdref _tpduf._tpduf_dref
#define tpdu_DRsref _tpdufr.DR._tpdufr_sref
#define tpdu_DRreason _tpdufr.DR._tpdufr_reason
- unsigned short _tpdufr_sref; /* source reference */
+ unsigned short _tpdufr_sref; /* source reference */
#define tpdu_DCli _tpduf._tpduf_li
#define tpdu_DCtype _tpduf._tpduf_type
#define tpdu_DCdref _tpduf._tpduf_dref
#define tpdu_DCsref _tpdufr._tpdufr_sref
- struct {
+ struct {
#if BYTE_ORDER == BIG_ENDIAN
- unsigned char _tpdufr_eot:1, /* end-of-tsdu */
- _tpdufr_seq:7; /* 7 bit sequence number */
+ unsigned char _tpdufr_eot:1, /* end-of-tsdu */
+ _tpdufr_seq:7; /* 7 bit sequence number */
#endif
#if BYTE_ORDER == LITTLE_ENDIAN
- unsigned char _tpdufr_seq:7, /* 7 bit sequence number */
- _tpdufr_eot:1; /* end-of-tsdu */
+ unsigned char _tpdufr_seq:7, /* 7 bit sequence number */
+ _tpdufr_eot:1; /* end-of-tsdu */
#endif
- }SEQEOT;
- struct {
+ } SEQEOT;
+ struct {
#if BYTE_ORDER == BIG_ENDIAN
- unsigned int _tpdufr_Xeot:1, /* end-of-tsdu */
- _tpdufr_Xseq:31; /* 31 bit sequence number */
+ unsigned int _tpdufr_Xeot:1, /* end-of-tsdu */
+ _tpdufr_Xseq:31; /* 31 bit sequence
+ * number */
#endif
#if BYTE_ORDER == LITTLE_ENDIAN
- unsigned int _tpdufr_Xseq:31, /* 31 bit sequence number */
- _tpdufr_Xeot:1; /* end-of-tsdu */
+ unsigned int _tpdufr_Xseq:31, /* 31 bit sequence
+ * number */
+ _tpdufr_Xeot:1; /* end-of-tsdu */
#endif
- }SEQEOT31;
- unsigned int _tpdufr_Xseqeot;
+ } SEQEOT31;
+ unsigned int _tpdufr_Xseqeot;
#define tpdu_seqeotX _tpdufr._tpdufr_Xseqeot
#define tpdu_DTli _tpduf._tpduf_li
#define tpdu_XPDseqX _tpdufr.SEQEOT31._tpdufr_Xseq
#define tpdu_XPDeotX _tpdufr.SEQEOT31._tpdufr_Xeot
- struct {
+ struct {
#if BYTE_ORDER == BIG_ENDIAN
- unsigned _tpdufr_yrseq0:1, /* always zero */
- _tpdufr_yrseq:31; /* [ ISO 8073 13.9.3.d ] */
+ unsigned _tpdufr_yrseq0:1, /* always zero */
+ _tpdufr_yrseq:31; /* [ ISO 8073 13.9.3.d ] */
#endif
#if BYTE_ORDER == LITTLE_ENDIAN
- unsigned _tpdufr_yrseq:31, /* [ ISO 8073 13.9.3.d ] */
- _tpdufr_yrseq0:1; /* always zero */
+ unsigned _tpdufr_yrseq:31, /* [ ISO 8073 13.9.3.d ] */
+ _tpdufr_yrseq0:1; /* always zero */
#endif
- unsigned short _tpdufr_cdt; /* [ ISO 8073 13.9.3.b ] */
- } AK31;
+ unsigned short _tpdufr_cdt; /* [ ISO 8073 13.9.3.b ] */
+ } AK31;
#define tpdu_AKli _tpduf._tpduf_li
#define tpdu_AKtype _tpduf._tpduf_type
#define tpdu_AKdref _tpduf._tpduf_dref
#define tpdu_AKseq _tpdufr.SEQEOT._tpdufr_seq
#define tpdu_AKseqX _tpdufr.AK31._tpdufr_yrseq
-/* location of cdt depends on size of seq. numbers */
+ /* location of cdt depends on size of seq. numbers */
#define tpdu_AKcdt _tpduf._tpduf_cdt
#define tpdu_AKcdtX _tpdufr.AK31._tpdufr_cdt
#define tpdu_XAKseq _tpdufr.SEQEOT._tpdufr_seq
#define tpdu_XAKseqX _tpdufr.SEQEOT31._tpdufr_Xseq
- unsigned char _tpdu_ERreason; /* [ ISO 8073 13.12.3.c ] */
+ unsigned char _tpdu_ERreason; /* [ ISO 8073 13.12.3.c ] */
#define tpdu_ERli _tpduf._tpduf_li
#define tpdu_ERtype _tpduf._tpduf_type
};
struct tpdu {
- struct tpdu_fixed _tpduf;
- union tpdu_fixed_rest _tpdufr;
+ struct tpdu_fixed _tpduf;
+ union tpdu_fixed_rest _tpdufr;
};
#endif /* _NETISO_TP_TPDU_H_ */
-/* $NetBSD: tp_trace.c,v 1.5 1994/06/29 06:40:44 cgd Exp $ */
+/* $OpenBSD: tp_trace.c,v 1.2 1996/03/04 10:36:40 mickey Exp $ */
+/* $NetBSD: tp_trace.c,v 1.6 1996/02/13 22:12:20 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
/*
* ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison
*/
-/*
- * The whole protocol trace module.
- * We keep a circular buffer of trace structures, which are big
- * unions of different structures we might want to see.
- * Unfortunately this gets too big pretty easily. Pcbs were removed
- * from the tracing when the kernel got too big to boot.
+/*
+ * The whole protocol trace module. We keep a circular buffer of trace
+ * structures, which are big unions of different structures we might want to
+ * see. Unfortunately this gets too big pretty easily. Pcbs were removed from
+ * the tracing when the kernel got too big to boot.
*/
#define TP_TRACEFILE
#include <netiso/tp_trace.h>
#ifdef TPPT
-static tp_seq = 0;
-u_char tp_traceflags[128];
+static tp_seq = 0;
+u_char tp_traceflags[128];
/*
* The argument tpcb is the obvious.
* The rest of the arguments have different uses depending
* on the type of trace event.
*/
-/*ARGSUSED*/
-/*VARARGS*/
+/* ARGSUSED */
+/* VARARGS */
void
tpTrace(tpcb, event, arg, src, len, arg4, arg5)
- struct tp_pcb *tpcb;
- u_int event, arg;
- u_int src;
- u_int len;
- u_int arg4;
- u_int arg5;
+ struct tp_pcb *tpcb;
+ u_int event, arg;
+ u_int src;
+ u_int len;
+ u_int arg4;
+ u_int arg5;
{
register struct tp_Trace *tp;
tp->tpt_event = event;
tp->tpt_tseq = tp_seq++;
tp->tpt_arg = arg;
- if(tpcb)
+ if (tpcb)
tp->tpt_arg2 = tpcb->tp_lref;
- bcopy( (caddr_t)&time, (caddr_t)&tp->tpt_time, sizeof(struct timeval) );
+ bcopy((caddr_t) & time, (caddr_t) & tp->tpt_time, sizeof(struct timeval));
- switch(event) {
+ switch (event) {
case TPPTertpdu:
- bcopy((caddr_t)src, (caddr_t)&tp->tpt_ertpdu,
- (unsigned)MIN((int)len, sizeof(struct tp_Trace)));
+ bcopy((caddr_t) src, (caddr_t) & tp->tpt_ertpdu,
+ (unsigned) MIN((int) len, sizeof(struct tp_Trace)));
break;
case TPPTusrreq:
case TPPTmisc:
/* arg is a string */
- bcopy((caddr_t)arg, (caddr_t)tp->tpt_str,
- (unsigned)MIN(1+strlen((caddr_t) arg), TPTRACE_STRLEN));
- tp->tpt_m2 = src;
+ bcopy((caddr_t) arg, (caddr_t) tp->tpt_str,
+ (unsigned) MIN(1 + strlen((caddr_t) arg), TPTRACE_STRLEN));
+ tp->tpt_m2 = src;
tp->tpt_m3 = len;
tp->tpt_m4 = arg4;
tp->tpt_m1 = arg5;
break;
- case TPPTgotXack:
- case TPPTXack:
- case TPPTsendack:
- case TPPTgotack:
- case TPPTack:
- case TPPTindicate:
+ case TPPTgotXack:
+ case TPPTXack:
+ case TPPTsendack:
+ case TPPTgotack:
+ case TPPTack:
+ case TPPTindicate:
default:
- case TPPTdriver:
- tp->tpt_m2 = arg;
+ case TPPTdriver:
+ tp->tpt_m2 = arg;
tp->tpt_m3 = src;
tp->tpt_m4 = len;
tp->tpt_m5 = arg4;
- tp->tpt_m1 = arg5;
+ tp->tpt_m1 = arg5;
break;
case TPPTparam:
- bcopy((caddr_t)src, (caddr_t)&tp->tpt_param, sizeof(struct tp_param));
+ bcopy((caddr_t) src, (caddr_t) & tp->tpt_param, sizeof(struct tp_param));
break;
case TPPTref:
- bcopy((caddr_t)src, (caddr_t)&tp->tpt_ref, sizeof(struct tp_ref));
+ bcopy((caddr_t) src, (caddr_t) & tp->tpt_ref, sizeof(struct tp_ref));
break;
case TPPTtpduin:
case TPPTtpduout:
tp->tpt_arg2 = arg4;
- bcopy((caddr_t)src, (caddr_t)&tp->tpt_tpdu,
- (unsigned)MIN((int)len, sizeof(struct tp_Trace)));
+ bcopy((caddr_t) src, (caddr_t) & tp->tpt_tpdu,
+ (unsigned) MIN((int) len, sizeof(struct tp_Trace)));
break;
}
}
-#endif /* TPPT */
+#endif /* TPPT */
-/* $NetBSD: tp_trace.h,v 1.6 1995/03/26 20:35:33 jtc Exp $ */
+/* $OpenBSD: tp_trace.h,v 1.2 1996/03/04 10:36:41 mickey Exp $ */
+/* $NetBSD: tp_trace.h,v 1.7 1996/02/13 22:12:23 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
/*
* ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison
*/
-/*
+/*
* Definitions needed for the protocol trace mechanism.
*/
/* for packet tracing */
struct tp_timeval {
- SeqNum tptv_seq;
- u_int tptv_kind;
- u_int tptv_window;
- u_int tptv_size;
+ SeqNum tptv_seq;
+ u_int tptv_kind;
+ u_int tptv_window;
+ u_int tptv_size;
};
-struct tp_Trace {
- u_int tpt_event;
- u_int tpt_arg;
- u_int tpt_arg2;
- int tpt_tseq;
- struct timeval tpt_time;
+struct tp_Trace {
+ u_int tpt_event;
+ u_int tpt_arg;
+ u_int tpt_arg2;
+ int tpt_tseq;
+ struct timeval tpt_time;
union {
- struct inpcb tpt_Inpcb; /* protocol control block */
- struct tp_ref tpt_Ref; /* ref part of pcb */
- struct tpdu tpt_Tpdu; /* header*/
- struct tp_refinfo tpt_Param; /* ?? bytes, make sure < 128??*/
+ struct inpcb tpt_Inpcb; /* protocol control block */
+ struct tp_ref tpt_Ref; /* ref part of pcb */
+ struct tpdu tpt_Tpdu; /* header */
+ struct tp_refinfo tpt_Param; /* ?? bytes, make sure <
+ * 128?? */
struct tp_timeval tpt_Time;
struct {
- u_int tptm_2;
- u_int tptm_3;
- u_int tptm_4;
- u_int tptm_5;
- char tpt_Str[TPTRACE_STRLEN];
- u_int tptm_1;
- } tptmisc;
- u_char tpt_Ertpdu; /* use rest of structure */
- } tpt_stuff;
+ u_int tptm_2;
+ u_int tptm_3;
+ u_int tptm_4;
+ u_int tptm_5;
+ char tpt_Str[TPTRACE_STRLEN];
+ u_int tptm_1;
+ } tptmisc;
+ u_char tpt_Ertpdu; /* use rest of structure */
+ } tpt_stuff;
};
#define tpt_inpcb tpt_stuff.tpt_Inpcb
#define tpt_pcb tpt_stuff.tpt_Pcb
#define tpt_window tpt_stuff.tpt_Time.tptv_window
#define tpt_size tpt_stuff.tpt_Time.tptv_size
-#endif /* defined(TP_TRACEFILE)||!defined(_KERNEL) */
+#endif /* defined(TP_TRACEFILE)||!defined(_KERNEL) */
#ifdef TPPT
tpTrace(tpcb,\
(u_int)(A),(u_int)(B),(u_int)(C),(u_int)(D),(u_int)(E),(u_int)(F))
-extern void tpTrace();
+extern void tpTrace();
extern struct tp_Trace tp_Trace[];
-extern u_char tp_traceflags[];
-int tp_Tracen = 0;
-
-#define IFTRACE(ascii)\
- if(tp_traceflags[ascii]) {
-/*
- * for some reason lint complains about tp_param being undefined no
- * matter where or how many times I define it.
- */
-#define ENDTRACE }
+extern u_char tp_traceflags[];
+int tp_Tracen = 0;
-#else /* TPPT */
+#else /* TPPT */
/***********************************************
* NO TPPT TRACE STUFF
#define tptrace(A,B,C,D,E,F) 0
#define tptraceTPCB(A,B,C,D,E,F) 0
-#define IFTRACE(ascii) if (0) {
-#define ENDTRACE }
-
-#endif /* TPPT */
+#endif /* TPPT */
-#endif /* _NETISO_TP_TRACE_H_ */
+#endif /* _NETISO_TP_TRACE_H_ */
-/* $NetBSD: tp_user.h,v 1.5 1994/06/29 06:40:48 cgd Exp $ */
+/* $OpenBSD: tp_user.h,v 1.2 1996/03/04 10:36:43 mickey Exp $ */
+/* $NetBSD: tp_user.h,v 1.6 1996/02/13 22:12:25 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
/*
* ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison
*/
-/*
- * These are the values a real-live user ;-) needs.
+/*
+ * These are the values a real-live user ;-) needs.
*/
#include <sys/types.h>
struct tp_conn_param {
/* PER CONNECTION parameters */
- short p_Nretrans;
- short p_dr_ticks;
-
- short p_cc_ticks;
- short p_dt_ticks;
-
- short p_x_ticks;
- short p_cr_ticks;
-
- short p_keepalive_ticks;
- short p_sendack_ticks;
-
- short p_ref_ticks;
- short p_inact_ticks;
-
- short p_ptpdusize; /* preferred tpdusize/128 */
- short p_winsize;
-
- u_char p_tpdusize; /* log 2 of size */
-
- u_char p_ack_strat; /* see comments in tp_pcb.h */
- u_char p_rx_strat; /* see comments in tp_pcb.h */
- u_char p_class; /* class bitmask */
- u_char p_xtd_format;
- u_char p_xpd_service;
- u_char p_use_checksum;
- u_char p_use_nxpd; /* netwk expedited data: not implemented */
- u_char p_use_rcc; /* receipt confirmation: not implemented */
- u_char p_use_efc; /* explicit flow control: not implemented */
- u_char p_no_disc_indications; /* don't deliver indic on disc */
- u_char p_dont_change_params; /* use these params as they are */
- u_char p_netservice;
- u_char p_version; /* only here for checking */
+ short p_Nretrans;
+ short p_dr_ticks;
+
+ short p_cc_ticks;
+ short p_dt_ticks;
+
+ short p_x_ticks;
+ short p_cr_ticks;
+
+ short p_keepalive_ticks;
+ short p_sendack_ticks;
+
+ short p_ref_ticks;
+ short p_inact_ticks;
+
+ short p_ptpdusize; /* preferred tpdusize/128 */
+ short p_winsize;
+
+ u_char p_tpdusize; /* log 2 of size */
+
+ u_char p_ack_strat; /* see comments in tp_pcb.h */
+ u_char p_rx_strat; /* see comments in tp_pcb.h */
+ u_char p_class;/* class bitmask */
+ u_char p_xtd_format;
+ u_char p_xpd_service;
+ u_char p_use_checksum;
+ u_char p_use_nxpd; /* netwk expedited data: not
+ * implemented */
+ u_char p_use_rcc; /* receipt confirmation: not
+ * implemented */
+ u_char p_use_efc; /* explicit flow control: not
+ * implemented */
+ u_char p_no_disc_indications; /* don't deliver indic on
+ * disc */
+ u_char p_dont_change_params; /* use these params as they
+ * are */
+ u_char p_netservice;
+ u_char p_version; /* only here for checking */
};
/*
#define SOL_NETWORK 0xfffd
/* get/set socket opt commands */
-#define TPACK_WINDOW 0x0 /* ack only on full window */
-#define TPACK_EACH 0x1 /* ack every packet */
+#define TPACK_WINDOW 0x0 /* ack only on full window */
+#define TPACK_EACH 0x1 /* ack every packet */
-#define TPRX_USE_CW 0x8 /* use congestion window transmit */
-#define TPRX_EACH 0x4 /* retrans each packet of a set */
-#define TPRX_FASTSTART 0x1 /* don't use slow start */
+#define TPRX_USE_CW 0x8 /* use congestion window
+ * transmit */
+#define TPRX_EACH 0x4 /* retrans each packet of a
+ * set */
+#define TPRX_FASTSTART 0x1 /* don't use slow start */
#define TPOPT_INTERCEPT 0x200
#define TPOPT_FLAGS 0x300
-#define TPOPT_CONN_DATA 0x400
-#define TPOPT_DISC_DATA 0x500
-#define TPOPT_CFRM_DATA 0x600
-#define TPOPT_CDDATA_CLEAR 0x700
-#define TPOPT_MY_TSEL 0x800
-#define TPOPT_PEER_TSEL 0x900
+#define TPOPT_CONN_DATA 0x400
+#define TPOPT_DISC_DATA 0x500
+#define TPOPT_CFRM_DATA 0x600
+#define TPOPT_CDDATA_CLEAR 0x700
+#define TPOPT_MY_TSEL 0x800
+#define TPOPT_PEER_TSEL 0x900
#define TPOPT_PERF_MEAS 0xa00
#define TPOPT_PSTATISTICS 0xb00
-#define TPOPT_PARAMS 0xc00 /* to replace a bunch of the others */
+#define TPOPT_PARAMS 0xc00 /* to replace a bunch of the others */
#define TPOPT_DISC_REASON 0xe00
struct tp_disc_reason {
- struct cmsghdr dr_hdr;
- u_int dr_reason;
+ struct cmsghdr dr_hdr;
+ u_int dr_reason;
};
-/*
- ***********************flags**********************************
+/*
+ * **********************flags**********************************
*/
/* read only flags */
#define TPFLAG_NLQOS_PDN (u_char)0x01
#define TPFLAG_PEER_ON_SAMENET (u_char)0x02
-#define TPFLAG_GENERAL_ADDR (u_char)0x04 /* bound to wildcard addr */
+#define TPFLAG_GENERAL_ADDR (u_char)0x04 /* bound to wildcard
+ * addr */
-/*
- ***********************end flags******************************
+/*
+ * **********************end flags******************************
*/
-#endif /* _NETISO_TP_USER_H_ */
+#endif /* _NETISO_TP_USER_H_ */
-/* $NetBSD: tp_usrreq.c,v 1.7 1995/08/12 23:59:52 mycroft Exp $ */
+/* $OpenBSD: tp_usrreq.c,v 1.2 1996/03/04 10:36:45 mickey Exp $ */
+/* $NetBSD: tp_usrreq.c,v 1.8 1996/02/13 22:12:27 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+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.
+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
/*
* ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison
*/
-/*
+/*
* tp_usrreq(), the fellow that gets called from most of the socket code.
- * Pretty straighforward.
- * THe only really awful stuff here is the OOB processing, which is done
- * wholly here.
- * tp_rcvoob() and tp_sendoob() are contained here and called by tp_usrreq().
+ * Pretty straighforward. THe only really awful stuff here is the OOB
+ * processing, which is done wholly here. tp_rcvoob() and tp_sendoob() are
+ * contained here and called by tp_usrreq().
*/
#include <sys/param.h>
#include <sys/protosw.h>
#include <sys/errno.h>
#include <sys/time.h>
+#include <sys/proc.h>
#include <netiso/tp_param.h>
#include <netiso/tp_timer.h>
#include <netiso/tp_seq.h>
#include <netiso/tp_ip.h>
#include <netiso/tp_pcb.h>
+#include <netiso/tp_var.h>
#include <netiso/argo_debug.h>
#include <netiso/tp_trace.h>
#include <netiso/tp_meas.h>
#include <netiso/iso.h>
#include <netiso/iso_errno.h>
-int tp_attach(), tp_pcbbind();
-int TNew;
-int TPNagle1, TPNagle2;
-struct tp_pcb *tp_listeners, *tp_intercepts;
+int TNew;
+int TPNagle1, TPNagle2;
+struct tp_pcb *tp_listeners, *tp_intercepts;
#ifdef ARGO_DEBUG
/*
*/
void
dump_mbuf(n, str)
- struct mbuf *n;
- char *str;
+ struct mbuf *n;
+ char *str;
{
- struct mbuf *nextrecord;
+ struct mbuf *nextrecord;
printf("dump %s\n", str);
- if (n == MNULL) {
+ if (n == MNULL) {
printf("EMPTY:\n");
return;
}
-
while (n) {
nextrecord = n->m_act;
printf("RECORD:\n");
while (n) {
printf("%x : Len %x Data %x A %x Nx %x Tp %x\n",
- n, n->m_len, n->m_data, n->m_act, n->m_next, n->m_type);
+ n, n->m_len, n->m_data, n->m_act, n->m_next, n->m_type);
#ifdef notdef
{
- register char *p = mtod(n, char *);
- register int i;
+ register char *p = mtod(n, char *);
+ register int i;
printf("data: ");
for (i = 0; i < n->m_len; i++) {
- if (i%8 == 0)
+ if (i % 8 == 0)
printf("\n");
- printf("0x%x ", *(p+i));
+ printf("0x%x ", *(p + i));
}
printf("\n");
}
-#endif /* notdef */
+#endif /* notdef */
if (n->m_next == n) {
printf("LOOP!\n");
return;
printf("\n");
}
-#endif /* ARGO_DEBUG */
+#endif /* ARGO_DEBUG */
/*
* CALLED FROM:
* xpd data in the buffer
* E* whatever is returned from the fsm.
*/
+int
tp_rcvoob(tpcb, so, m, outflags, inflags)
- struct tp_pcb *tpcb;
- register struct socket *so;
- register struct mbuf *m;
- int *outflags;
- int inflags;
+ struct tp_pcb *tpcb;
+ register struct socket *so;
+ register struct mbuf *m;
+ int *outflags;
+ int inflags;
{
register struct mbuf *n;
register struct sockbuf *sb = &so->so_rcv;
struct tp_event E;
- int error = 0;
+ int error = 0;
register struct mbuf **nn;
- IFDEBUG(D_XPD)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_XPD]) {
printf("PRU_RCVOOB, sostate 0x%x\n", so->so_state);
- ENDDEBUG
+ }
+#endif
/* if you use soreceive */
if (m == MNULL)
restart:
if ((((so->so_state & SS_ISCONNECTED) == 0)
- || (so->so_state & SS_ISDISCONNECTING) != 0) &&
- (so->so_proto->pr_flags & PR_CONNREQUIRED)) {
- return ENOTCONN;
+ || (so->so_state & SS_ISDISCONNECTING) != 0) &&
+ (so->so_proto->pr_flags & PR_CONNREQUIRED)) {
+ return ENOTCONN;
}
-
- /* Take the first mbuf off the chain.
- * Each XPD TPDU gives you a complete TSDU so the chains don't get
- * coalesced, but one TSDU may span several mbufs.
- * Nevertheless, since n should have a most 16 bytes, it
- * will fit into m. (size was checked in tp_input() )
+ /*
+ * Take the first mbuf off the chain. Each XPD TPDU gives you a
+ * complete TSDU so the chains don't get coalesced, but one TSDU may
+ * span several mbufs. Nevertheless, since n should have a most 16
+ * bytes, it will fit into m. (size was checked in tp_input() )
*/
/*
* Code for excision of OOB data should be added to
* uipc_socket2.c (like sbappend).
*/
-
+
sblock(sb, M_WAITOK);
- for (nn = &sb->sb_mb; n = *nn; nn = &n->m_act)
+ for (nn = &sb->sb_mb; (n = *nn) != NULL; nn = &n->m_act)
if (n->m_type == MT_OOBDATA)
break;
if (n == 0) {
- IFDEBUG(D_XPD)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_XPD]) {
printf("RCVOOB: empty queue!\n");
- ENDDEBUG
+ }
+#endif
sbunlock(sb);
if (so->so_state & SS_NBIO) {
- return EWOULDBLOCK;
+ return EWOULDBLOCK;
}
sbwait(sb);
goto restart;
/* Assuming at most one xpd tpdu is in the buffer at once */
while (n != MNULL) {
m->m_len += n->m_len;
- bcopy(mtod(n, caddr_t), mtod(m, caddr_t), (unsigned)n->m_len);
- m->m_data += n->m_len; /* so mtod() in bcopy() above gives right addr */
+ bcopy(mtod(n, caddr_t), mtod(m, caddr_t), (unsigned) n->m_len);
+ m->m_data += n->m_len; /* so mtod() in bcopy() above gives
+ * right addr */
n = n->m_next;
}
m->m_data = m->m_dat;
m->m_flags |= M_EOR;
- IFDEBUG(D_XPD)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_XPD]) {
printf("tp_rcvoob: xpdlen 0x%x\n", m->m_len);
dump_mbuf(so->so_rcv.sb_mb, "RCVOOB: Rcv socketbuf");
dump_mbuf(sb->sb_mb, "RCVOOB: Xrcv socketbuf");
- ENDDEBUG
+ }
+#endif
if ((inflags & MSG_PEEK) == 0) {
n = *nn;
*nn = n->m_act;
- for (; n; n = m_free(n))
+ for (; n; n = m_free(n))
sbfree(sb, n);
}
-
-release:
sbunlock(sb);
- IFTRACE(D_XPD)
+#ifdef TPPT
+ if (tp_traceflags[D_XPD]) {
tptraceTPCB(TPPTmisc, "PRU_RCVOOB @ release sb_cc m_len",
- tpcb->tp_Xrcv.sb_cc, m->m_len, 0, 0);
- ENDTRACE
+ tpcb->tp_Xrcv.sb_cc, m->m_len, 0, 0);
+ }
+#endif
if (error == 0)
- error = DoEvent(T_USR_Xrcvd);
+ error = DoEvent(T_USR_Xrcvd);
return error;
}
* EMSGSIZE if trying to send > max-xpd bytes (16)
* ENOBUFS if ran out of mbufs
*/
+int
tp_sendoob(tpcb, so, xdata, outflags)
- struct tp_pcb *tpcb;
- register struct socket *so;
- register struct mbuf *xdata;
- int *outflags; /* not used */
+ struct tp_pcb *tpcb;
+ register struct socket *so;
+ register struct mbuf *xdata;
+ int *outflags; /* not used */
{
/*
* Each mbuf chain represents a sequence # in the XPD seq space.
* mbuf (mark) into the DATA queue, with its sequence number in m_next
* to be assigned to this XPD tpdu, so data xfer can stop
* when it reaches the zero-length mbuf if this XPD TPDU hasn't
- * yet been acknowledged.
+ * yet been acknowledged.
*/
register struct sockbuf *sb = &(tpcb->tp_Xsnd);
- register struct mbuf *xmark;
- register int len=0;
+ register struct mbuf *xmark;
+ register int len = 0;
struct tp_event E;
- IFDEBUG(D_XPD)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_XPD]) {
printf("tp_sendoob:");
if (xdata)
printf("xdata len 0x%x\n", xdata->m_len);
- ENDDEBUG
- /* DO NOT LOCK the Xsnd buffer!!!! You can have at MOST one
- * socket buf locked at any time!!! (otherwise you might
- * sleep() in sblock() w/ a signal pending and cause the
- * system call to be aborted w/ a locked socketbuf, which
- * is a problem. So the so_snd buffer lock
+ }
+#endif
+ /*
+ * DO NOT LOCK the Xsnd buffer!!!! You can have at MOST one socket
+ * buf locked at any time!!! (otherwise you might sleep() in sblock()
+ * w/ a signal pending and cause the system call to be aborted w/ a
+ * locked socketbuf, which is a problem. So the so_snd buffer lock
* (done in sosend()) serves as the lock for Xpd.
*/
- if (sb->sb_mb) { /* Anything already in eXpedited data sockbuf? */
+ if (sb->sb_mb) { /* Anything already in eXpedited data
+ * sockbuf? */
if (so->so_state & SS_NBIO) {
return EWOULDBLOCK;
}
while (sb->sb_mb) {
- sbunlock(&so->so_snd); /* already locked by sosend */
+ sbunlock(&so->so_snd); /* already locked by sosend */
sbwait(&so->so_snd);
- sblock(&so->so_snd, M_WAITOK); /* sosend will unlock on return */
+ sblock(&so->so_snd, M_WAITOK); /* sosend will unlock on
+ * return */
}
}
-
- if (xdata == (struct mbuf *)0) {
+ if (xdata == (struct mbuf *) 0) {
/* empty xpd packet */
MGETHDR(xdata, M_WAIT, MT_OOBDATA);
if (xdata == NULL) {
xdata->m_len = 0;
xdata->m_pkthdr.len = 0;
}
- IFDEBUG(D_XPD)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_XPD]) {
printf("tp_sendoob 1:");
if (xdata)
printf("xdata len 0x%x\n", xdata->m_len);
- ENDDEBUG
- xmark = xdata; /* temporary use of variable xmark */
+ }
+#endif
+ xmark = xdata; /* temporary use of variable xmark */
while (xmark) {
len += xmark->m_len;
xmark = xmark->m_next;
if (len > TP_MAX_XPD_DATA) {
return EMSGSIZE;
}
- IFDEBUG(D_XPD)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_XPD]) {
printf("tp_sendoob 2:");
if (xdata)
printf("xdata len 0x%x\n", len);
- ENDDEBUG
+ }
+#endif
- IFTRACE(D_XPD)
+#ifdef TPPT
+ if (tp_traceflags[D_XPD]) {
tptraceTPCB(TPPTmisc, "XPD mark m_next ", xdata->m_next, 0, 0, 0);
- ENDTRACE
+ }
+#endif
- sbappendrecord(sb, xdata);
+ sbappendrecord(sb, xdata);
- IFDEBUG(D_XPD)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_XPD]) {
printf("tp_sendoob len 0x%x\n", len);
dump_mbuf(so->so_snd.sb_mb, "XPD request Regular sndbuf:");
dump_mbuf(tpcb->tp_Xsnd.sb_mb, "XPD request Xsndbuf:");
- ENDDEBUG
- return DoEvent(T_XPD_req);
+ }
+#endif
+ return DoEvent(T_XPD_req);
}
/*
* the socket routines
* FUNCTION and ARGUMENTS:
* Handles all "user requests" except the [gs]ockopts() requests.
- * The argument (req) is the request type (PRU*),
+ * The argument (req) is the request type (PRU*),
* (m) is an mbuf chain, generally used for send and
* receive type requests only.
* (nam) is used for addresses usually, in particular for the bind request.
- *
+ *
*/
-/*ARGSUSED*/
+/* ARGSUSED */
int
tp_usrreq(so, req, m, nam, controlp)
- struct socket *so;
- u_int req;
- struct mbuf *m, *nam, *controlp;
-{
- register struct tp_pcb *tpcb = sototpcb(so);
- int s = splsoftnet();
- int error = 0;
- int flags, *outflags = &flags;
- u_long eotsdu = 0;
+ struct socket *so;
+ int req;
+ struct mbuf *m, *nam, *controlp;
+{
+ register struct tp_pcb *tpcb = sototpcb(so);
+ int s = splsoftnet();
+ int error = 0;
+ int flags, *outflags = &flags;
+ u_long eotsdu = 0;
struct tp_event E;
- IFDEBUG(D_REQUEST)
- printf("usrreq(0x%x,%d,0x%x,0x%x,0x%x)\n",so,req,m,nam,outflags);
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_REQUEST]) {
+ printf("usrreq(0x%x,%d,0x%x,0x%x,0x%x)\n", so, req, m, nam, outflags);
if (so->so_error)
printf("WARNING!!! so->so_error is 0x%x\n", so->so_error);
- ENDDEBUG
- IFTRACE(D_REQUEST)
- tptraceTPCB(TPPTusrreq, "req so m state [", req, so, m,
- tpcb?tpcb->tp_state:0);
- ENDTRACE
-
- if ((u_long)tpcb == 0 && req != PRU_ATTACH) {
- IFTRACE(D_REQUEST)
+ }
+#endif
+#ifdef TPPT
+ if (tp_traceflags[D_REQUEST]) {
+ tptraceTPCB(TPPTusrreq, "req so m state [", req, so, m,
+ tpcb ? tpcb->tp_state : 0);
+ }
+#endif
+
+ if ((u_long) tpcb == 0 && req != PRU_ATTACH) {
+#ifdef TPPT
+ if (tp_traceflags[D_REQUEST]) {
tptraceTPCB(TPPTusrreq, "req failed NO TPCB[", 0, 0, 0, 0);
- ENDTRACE
+ }
+#endif
splx(s);
return ENOTCONN;
}
-
switch (req) {
case PRU_ATTACH:
if (tpcb) {
error = EISCONN;
- } else if ((error = tp_attach(so, (long)nam)) == 0)
+ } else if ((error = tp_attach(so, (long) nam)) == 0)
tpcb = sototpcb(so);
break;
- case PRU_ABORT: /* called from close() */
- /* called for each incoming connect queued on the
- * parent (accepting) socket
+ case PRU_ABORT: /* called from close() */
+ /*
+ * called for each incoming connect queued on the parent
+ * (accepting) socket
*/
if (tpcb->tp_state == TP_OPEN || tpcb->tp_state == TP_CONFIRMING) {
- E.ATTR(T_DISC_req).e_reason = E_TP_NO_SESSION ^ TP_ERROR_MASK;
- error = DoEvent(T_DISC_req); /* pretend it was a close() */
+ E.TPDU_ATTR(REQ).e_reason = E_TP_NO_SESSION ^ TP_ERROR_MASK;
+ error = DoEvent(T_DISC_req); /* pretend it was a
+ * close() */
break;
- } /* else DROP THROUGH */
-
- case PRU_DETACH: /* called from close() */
+ } /* else DROP THROUGH */
+ case PRU_DETACH: /* called from close() */
/* called only after disconnect was called */
error = DoEvent(T_DETACH);
if (tpcb->tp_state == TP_CLOSED) {
if (tpcb->tp_notdetached) {
- IFDEBUG(D_CONN)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
printf("PRU_DETACH: not detached\n");
- ENDDEBUG
+ }
+#endif
tp_detach(tpcb);
}
- free((caddr_t)tpcb, M_PCB);
+ free((caddr_t) tpcb, M_PCB);
tpcb = 0;
}
break;
case PRU_SHUTDOWN:
- /* recv end may have been released; local credit might be zero */
+ /*
+ * recv end may have been released; local credit might be
+ * zero
+ */
case PRU_DISCONNECT:
- E.ATTR(T_DISC_req).e_reason = E_TP_NORMAL_DISC ^ TP_ERROR_MASK;
+ E.TPDU_ATTR(REQ).e_reason = E_TP_NORMAL_DISC ^ TP_ERROR_MASK;
error = DoEvent(T_DISC_req);
break;
case PRU_BIND:
- error = tp_pcbbind(tpcb, nam);
+ error = tp_pcbbind(tpcb, nam);
break;
case PRU_LISTEN:
if (tpcb->tp_state != TP_CLOSED || tpcb->tp_lsuffixlen == 0 ||
- tpcb->tp_next == 0)
+ tpcb->tp_next == 0)
error = EINVAL;
else {
register struct tp_pcb **tt;
break;
case PRU_CONNECT2:
- error = EOPNOTSUPP; /* for unix domain sockets */
+ error = EOPNOTSUPP; /* for unix domain sockets */
break;
case PRU_CONNECT:
- IFTRACE(D_CONN)
- tptraceTPCB(TPPTmisc,
- "PRU_CONNECT: so 0x%x *SHORT_LSUFXP(tpcb) 0x%x lsuflen 0x%x, class 0x%x",
- tpcb->tp_sock, *SHORT_LSUFXP(tpcb), tpcb->tp_lsuffixlen,
- tpcb->tp_class);
- ENDTRACE
- IFDEBUG(D_CONN)
+#ifdef TPPT
+ if (tp_traceflags[D_CONN]) {
+ tptraceTPCB(TPPTmisc,
+ "PRU_CONNECT: so 0x%x *SHORT_LSUFXP(tpcb) 0x%x lsuflen 0x%x, class 0x%x",
+ tpcb->tp_sock, *SHORT_LSUFXP(tpcb), tpcb->tp_lsuffixlen,
+ tpcb->tp_class);
+ }
+#endif
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
printf("PRU_CONNECT: so *SHORT_LSUFXP(tpcb) 0x%x lsuflen 0x%x, class 0x%x",
- tpcb->tp_sock, *SHORT_LSUFXP(tpcb), tpcb->tp_lsuffixlen,
- tpcb->tp_class);
- ENDDEBUG
+ tpcb->tp_sock, *SHORT_LSUFXP(tpcb), tpcb->tp_lsuffixlen,
+ tpcb->tp_class);
+ }
+#endif
if (tpcb->tp_lsuffixlen == 0) {
- if (error = tp_pcbbind(tpcb, MNULL)) {
- IFDEBUG(D_CONN)
+ if ((error = tp_pcbbind(tpcb, MNULL)) != 0) {
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
printf("pcbbind returns error 0x%x\n", error);
- ENDDEBUG
+ }
+#endif
break;
}
}
- IFDEBUG(D_CONN)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
printf("isop 0x%x isop->isop_socket offset 12 :\n", tpcb->tp_npcb);
dump_buf(tpcb->tp_npcb, 16);
- ENDDEBUG
- if (error = tp_route_to(nam, tpcb, /* channel */0))
+ }
+#endif
+ if ((error = tp_route_to(nam, tpcb, /* channel */ 0)) != 0)
break;
- IFDEBUG(D_CONN)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_CONN]) {
printf(
- "PRU_CONNECT after tpcb 0x%x so 0x%x npcb 0x%x flags 0x%x\n",
- tpcb, so, tpcb->tp_npcb, tpcb->tp_flags);
+ "PRU_CONNECT after tpcb 0x%x so 0x%x npcb 0x%x flags 0x%x\n",
+ tpcb, so, tpcb->tp_npcb, tpcb->tp_flags);
printf("isop 0x%x isop->isop_socket offset 12 :\n", tpcb->tp_npcb);
dump_buf(tpcb->tp_npcb, 16);
- ENDDEBUG
- if (tpcb->tp_fsuffixlen == 0) {
+ }
+#endif
+ if (tpcb->tp_fsuffixlen == 0) {
/* didn't set peer extended suffix */
- (tpcb->tp_nlproto->nlp_getsufx)(tpcb->tp_npcb, &tpcb->tp_fsuffixlen,
- tpcb->tp_fsuffix, TP_FOREIGN);
+ (tpcb->tp_nlproto->nlp_getsufx) (tpcb->tp_npcb,
+ &tpcb->tp_fsuffixlen,
+ tpcb->tp_fsuffix, TP_FOREIGN);
}
if (tpcb->tp_state == TP_CLOSED) {
- soisconnecting(so);
+ soisconnecting(so);
error = DoEvent(T_CONN_req);
} else {
- (tpcb->tp_nlproto->nlp_pcbdisc)(tpcb->tp_npcb);
+ (tpcb->tp_nlproto->nlp_pcbdisc) (tpcb->tp_npcb);
error = EISCONN;
}
- IFPERF(tpcb)
- u_int lsufx, fsufx;
- lsufx = *(u_short *)(tpcb->tp_lsuffix);
- fsufx = *(u_short *)(tpcb->tp_fsuffix);
-
- tpmeas(tpcb->tp_lref,
- TPtime_open | (tpcb->tp_xtd_format << 4),
- &time, lsufx, fsufx, tpcb->tp_fref);
- ENDPERF
+#ifdef TP_PERF_MEAS
+ if (DOPERF(tpcb)) {
+ u_int lsufx, fsufx;
+ lsufx = *(u_short *) (tpcb->tp_lsuffix);
+ fsufx = *(u_short *) (tpcb->tp_fsuffix);
+
+ tpmeas(tpcb->tp_lref,
+ TPtime_open | (tpcb->tp_xtd_format << 4),
+ &time, lsufx, fsufx, tpcb->tp_fref);
+ }
+#endif
break;
- case PRU_ACCEPT:
- (tpcb->tp_nlproto->nlp_getnetaddr)(tpcb->tp_npcb, nam, TP_FOREIGN);
- IFDEBUG(D_REQUEST)
+ case PRU_ACCEPT:
+ (tpcb->tp_nlproto->nlp_getnetaddr) (tpcb->tp_npcb, nam, TP_FOREIGN);
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_REQUEST]) {
printf("ACCEPT PEERADDDR:");
dump_buf(mtod(nam, char *), nam->m_len);
- ENDDEBUG
- IFPERF(tpcb)
- u_int lsufx, fsufx;
- lsufx = *(u_short *)(tpcb->tp_lsuffix);
- fsufx = *(u_short *)(tpcb->tp_fsuffix);
-
- tpmeas(tpcb->tp_lref, TPtime_open,
- &time, lsufx, fsufx, tpcb->tp_fref);
- ENDPERF
+ }
+#endif
+#ifdef TP_PERF_MEAS
+ if (DOPERF(tpcb)) {
+ u_int lsufx, fsufx;
+ lsufx = *(u_short *) (tpcb->tp_lsuffix);
+ fsufx = *(u_short *) (tpcb->tp_fsuffix);
+
+ tpmeas(tpcb->tp_lref, TPtime_open,
+ &time, lsufx, fsufx, tpcb->tp_fref);
+ }
+#endif
break;
case PRU_RCVD:
error = tp_confirm(tpcb);
break;
}
- IFTRACE(D_DATA)
+#ifdef TPPT
+ if (tp_traceflags[D_DATA]) {
tptraceTPCB(TPPTmisc,
- "RCVD BF: lcredit sent_lcdt cc hiwat \n",
- tpcb->tp_lcredit, tpcb->tp_sent_lcdt,
- so->so_rcv.sb_cc, so->so_rcv.sb_hiwat);
+ "RCVD BF: lcredit sent_lcdt cc hiwat \n",
+ tpcb->tp_lcredit, tpcb->tp_sent_lcdt,
+ so->so_rcv.sb_cc, so->so_rcv.sb_hiwat);
LOCAL_CREDIT(tpcb);
- tptraceTPCB(TPPTmisc,
- "PRU_RCVD AF sbspace lcredit hiwat cc",
- sbspace(&so->so_rcv), tpcb->tp_lcredit,
- so->so_rcv.sb_cc, so->so_rcv.sb_hiwat);
- ENDTRACE
- IFDEBUG(D_REQUEST)
+ tptraceTPCB(TPPTmisc,
+ "PRU_RCVD AF sbspace lcredit hiwat cc",
+ sbspace(&so->so_rcv), tpcb->tp_lcredit,
+ so->so_rcv.sb_cc, so->so_rcv.sb_hiwat);
+ }
+#endif
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_REQUEST]) {
printf("RCVD: cc %d space %d hiwat %d\n",
- so->so_rcv.sb_cc, sbspace(&so->so_rcv),
- so->so_rcv.sb_hiwat);
- ENDDEBUG
- if (((long)nam) & MSG_OOB)
- error = DoEvent(T_USR_Xrcvd);
- else
- error = DoEvent(T_USR_rcvd);
+ so->so_rcv.sb_cc, sbspace(&so->so_rcv),
+ so->so_rcv.sb_hiwat);
+ }
+#endif
+ if (((long) nam) & MSG_OOB)
+ error = DoEvent(T_USR_Xrcvd);
+ else
+ error = DoEvent(T_USR_rcvd);
break;
case PRU_RCVOOB:
error = ENOTCONN;
break;
}
- if (! tpcb->tp_xpd_service) {
+ if (!tpcb->tp_xpd_service) {
error = EOPNOTSUPP;
break;
}
/* kludge - nam is really flags here */
- error = tp_rcvoob(tpcb, so, m, outflags, (long)nam);
+ error = tp_rcvoob(tpcb, so, m, outflags, (long) nam);
break;
case PRU_SEND:
if ((so->so_state & SS_ISCONFIRMING) &&
(tpcb->tp_state == TP_CONFIRMING) &&
(error = tp_confirm(tpcb)))
- break;
+ break;
if (req == PRU_SENDOOB) {
error = (tpcb->tp_xpd_service == 0) ?
- EOPNOTSUPP : tp_sendoob(tpcb, so, m, outflags);
+ EOPNOTSUPP : tp_sendoob(tpcb, so, m, outflags);
break;
}
if (m == 0)
{
/*
* Could have eotsdu and no data.(presently MUST have
- * an mbuf though, even if its length == 0)
+ * an mbuf though, even if its length == 0)
*/
- int totlen = m->m_pkthdr.len;
+ int totlen = m->m_pkthdr.len;
struct sockbuf *sb = &so->so_snd;
- IFPERF(tpcb)
- PStat(tpcb, Nb_from_sess) += totlen;
- tpmeas(tpcb->tp_lref, TPtime_from_session, 0, 0,
- PStat(tpcb, Nb_from_sess), totlen);
- ENDPERF
- IFDEBUG(D_SYSCALL)
+#ifdef TP_PERF_MEAS
+ if (DOPERF(tpcb)) {
+ PStat(tpcb, Nb_from_sess) += totlen;
+ tpmeas(tpcb->tp_lref, TPtime_from_session, 0, 0,
+ PStat(tpcb, Nb_from_sess), totlen);
+ }
+#endif
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_SYSCALL]) {
printf(
- "PRU_SEND: eot %d before sbappend 0x%x len 0x%x to sb @ 0x%x\n",
- eotsdu, m, totlen, sb);
+ "PRU_SEND: eot %d before sbappend 0x%x len 0x%x to sb @ 0x%x\n",
+ eotsdu, m, totlen, sb);
dump_mbuf(sb->sb_mb, "so_snd.sb_mb");
dump_mbuf(m, "m : to be added");
- ENDDEBUG
+ }
+#endif
tp_packetize(tpcb, m, eotsdu);
- IFDEBUG(D_SYSCALL)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_SYSCALL]) {
printf("PRU_SEND: eot %d after sbappend 0x%x\n", eotsdu, m);
dump_mbuf(sb->sb_mb, "so_snd.sb_mb");
- ENDDEBUG
+ }
+#endif
if (tpcb->tp_state == TP_OPEN)
- error = DoEvent(T_DATA_req);
- IFDEBUG(D_SYSCALL)
- printf("PRU_SEND: after driver error 0x%x \n",error);
+ error = DoEvent(T_DATA_req);
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_SYSCALL]) {
+ printf("PRU_SEND: after driver error 0x%x \n", error);
printf("so_snd 0x%x cc 0t%d mbcnt 0t%d\n",
- sb, sb->sb_cc, sb->sb_mbcnt);
+ sb, sb->sb_cc, sb->sb_mbcnt);
dump_mbuf(sb->sb_mb, "so_snd.sb_mb after driver");
- ENDDEBUG
+ }
+#endif
}
break;
case PRU_SOCKADDR:
- (tpcb->tp_nlproto->nlp_getnetaddr)(tpcb->tp_npcb, nam, TP_LOCAL);
+ (tpcb->tp_nlproto->nlp_getnetaddr) (tpcb->tp_npcb, nam, TP_LOCAL);
break;
case PRU_PEERADDR:
- (tpcb->tp_nlproto->nlp_getnetaddr)(tpcb->tp_npcb, nam, TP_FOREIGN);
+ (tpcb->tp_nlproto->nlp_getnetaddr) (tpcb->tp_npcb, nam, TP_FOREIGN);
break;
case PRU_CONTROL:
default:
#ifdef ARGO_DEBUG
printf("tp_usrreq UNKNOWN PRU %d\n", req);
-#endif /* ARGO_DEBUG */
+#endif /* ARGO_DEBUG */
error = EOPNOTSUPP;
}
- IFDEBUG(D_REQUEST)
+#ifdef ARGO_DEBUG
+ if (argo_debug[D_REQUEST]) {
printf("%s, so 0x%x, tpcb 0x%x, error %d, state %d\n",
- "returning from tp_usrreq", so, tpcb, error,
- tpcb ? tpcb->tp_state : 0);
- ENDDEBUG
- IFTRACE(D_REQUEST)
- tptraceTPCB(TPPTusrreq, "END req so m state [", req, so, m,
- tpcb ? tpcb->tp_state : 0);
- ENDTRACE
+ "returning from tp_usrreq", so, tpcb, error,
+ tpcb ? tpcb->tp_state : 0);
+ }
+#endif
+#ifdef TPPT
+ if (tp_traceflags[D_REQUEST]) {
+ tptraceTPCB(TPPTusrreq, "END req so m state [", req, so, m,
+ tpcb ? tpcb->tp_state : 0);
+ }
+#endif
if (controlp) {
m_freem(controlp);
printf("control data unexpectedly retained in tp_usrreq()");
splx(s);
return error;
}
+
+void
tp_ltrace(so, uio)
-struct socket *so;
-struct uio *uio;
+ struct socket *so;
+ struct uio *uio;
{
- IFTRACE(D_DATA)
- register struct tp_pcb *tpcb = sototpcb(so);
+#ifdef TPPT
+ if (tp_traceflags[D_DATA]) {
+ register struct tp_pcb *tpcb = sototpcb(so);
if (tpcb) {
tptraceTPCB(TPPTmisc, "sosend so resid iovcnt", so,
- uio->uio_resid, uio->uio_iovcnt, 0);
+ uio->uio_resid, uio->uio_iovcnt, 0);
}
- ENDTRACE
+ }
+#endif
}
+int
tp_confirm(tpcb)
-register struct tp_pcb *tpcb;
+ register struct tp_pcb *tpcb;
{
struct tp_event E;
if (tpcb->tp_state == TP_CONFIRMING)
- return DoEvent(T_ACPT_req);
+ return DoEvent(T_ACPT_req);
printf("Tp confirm called when not confirming; tpcb 0x%x, state 0x%x\n",
- tpcb, tpcb->tp_state);
+ tpcb, tpcb->tp_state);
return 0;
}
/*
* Process control data sent with sendmsg()
*/
+int
tp_snd_control(m, so, data)
- struct mbuf *m;
- struct socket *so;
+ struct mbuf *m;
+ struct socket *so;
register struct mbuf **data;
{
register struct cmsghdr *ch;
- int error = 0;
+ int error = 0;
if (m && m->m_len) {
ch = mtod(m, struct cmsghdr *);
- m->m_len -= sizeof (*ch);
- m->m_data += sizeof (*ch);
+ m->m_len -= sizeof(*ch);
+ m->m_data += sizeof(*ch);
error = tp_ctloutput(PRCO_SETOPT,
- so, ch->cmsg_level, ch->cmsg_type, &m);
+ so, ch->cmsg_level, ch->cmsg_type, &m);
if (ch->cmsg_type == TPOPT_DISC_DATA) {
if (data && *data) {
m_freem(*data);
*data = 0;
}
- error = tp_usrreq(so, PRU_DISCONNECT, (struct mbuf *)0,
- (caddr_t)0, (struct mbuf *)0);
+ error = tp_usrreq(so, PRU_DISCONNECT, NULL,
+ NULL, NULL);
}
}
if (m)
--- /dev/null
+/* $OpenBSD: tp_var.h,v 1.1 1996/03/04 10:36:47 mickey 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 __P((void *, struct mbuf *));
+void *tpcons_ctlinput __P((int, struct sockaddr *, void *));
+void tpcons_input __P((struct mbuf *, ...));
+int tpcons_output __P((struct mbuf *, ...));
+int tpcons_output_dg __P((struct mbuf *, ...));
+
+/* tp_driver.c */
+int tp_driver __P((struct tp_pcb *, struct tp_event *));
+
+/* tp_emit.c */
+int tp_emit __P((int, struct tp_pcb *, SeqNum, u_int, struct mbuf *));
+int tp_error_emit __P((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 __P((void *, u_short *, caddr_t, int));
+void in_putsufx __P((void *, caddr_t, int, int));
+void in_recycle_tsuffix __P((void *));
+void in_putnetaddr __P((void *, struct sockaddr *, int));
+int in_cmpnetaddr __P((void *, struct sockaddr *, int));
+void in_getnetaddr __P((void *, struct mbuf *, int));
+int tpip_mtu __P((void *));
+int tpip_output __P((struct mbuf *, ...));
+int tpip_output_dg __P((struct mbuf *, ...));
+void tpip_input __P((struct mbuf *, ...));
+void tpin_quench __P((struct inpcb *, int));
+void *tpip_ctlinput __P((int, struct sockaddr *, void *));
+void tpin_abort __P((struct inpcb *, int));
+void dump_inaddr __P((struct sockaddr_in *));
+
+/* tp_input.c */
+struct mbuf *tp_inputprep __P((struct mbuf *));
+void tp_input __P((struct mbuf *, ...));
+int tp_headersize __P((int, struct tp_pcb *));
+
+/* tp_iso.c */
+void iso_getsufx __P((void *, u_short *, caddr_t, int));
+void iso_putsufx __P((void *, caddr_t, int, int));
+void iso_recycle_tsuffix __P((void *));
+void iso_putnetaddr __P((void *, struct sockaddr *, int));
+int iso_cmpnetaddr __P((void *, struct sockaddr *, int));
+void iso_getnetaddr __P((void *, struct mbuf *, int));
+int tpclnp_mtu __P((void *));
+int tpclnp_output __P((struct mbuf *, ...));
+int tpclnp_output_dg __P((struct mbuf *, ...));
+void tpclnp_input __P((struct mbuf *, ...));
+void iso_rtchange __P((struct isopcb *));
+void tpiso_decbit __P((struct isopcb *));
+void tpiso_quench __P((struct isopcb *));
+void *tpclnp_ctlinput __P((int, struct sockaddr *, void *));
+void tpclnp_ctlinput1 __P((int, struct iso_addr *));
+void tpiso_abort __P((struct isopcb *));
+void tpiso_reset __P((struct isopcb *));
+
+/* tp_meas.c */
+void Tpmeas __P((u_int, u_int, struct timeval *, u_int, u_int, u_int));
+
+/* tp_output.c */
+int tp_consistency __P((struct tp_pcb *, u_int, struct tp_conn_param *));
+int tp_ctloutput __P((int, struct socket *, int, int, struct mbuf **));
+
+/* tp_pcb.c */
+void tp_init __P((void));
+void tp_soisdisconnecting __P((struct socket *));
+void tp_soisdisconnected __P((struct tp_pcb *));
+void tp_freeref __P((RefNum));
+u_long tp_getref __P((struct tp_pcb *));
+int tp_set_npcb __P((struct tp_pcb *));
+int tp_attach __P((struct socket *, long));
+void tp_detach __P((struct tp_pcb *));
+int tp_tselinuse __P((int, caddr_t, struct sockaddr_iso *, int));
+int tp_pcbbind __P((void *, struct mbuf *));
+
+/* tp_subr.c */
+int tp_goodXack __P((struct tp_pcb *, SeqNum));
+void tp_rtt_rtv __P((struct tp_pcb *));
+int tp_goodack __P((struct tp_pcb *, u_int, SeqNum, u_int));
+int tp_sbdrop __P((struct tp_pcb *, SeqNum));
+void tp_send __P((struct tp_pcb *));
+int tp_packetize __P((struct tp_pcb *, struct mbuf *, int));
+int tp_stash __P((struct tp_pcb *, struct tp_event *));
+void tp_rsyflush __P((struct tp_pcb *));
+void tp_rsyset __P((struct tp_pcb *));
+void tpsbcheck __P((struct tp_pcb *, int));
+
+/* tp_subr2.c */
+void tp_local_credit __P((struct tp_pcb *));
+int tp_protocol_error __P((struct tp_event *, struct tp_pcb *));
+void tp_drain __P((void));
+void tp_indicate __P((int, struct tp_pcb *, u_short));
+void tp_getoptions __P((struct tp_pcb *));
+void tp_recycle_tsuffix __P((void *));
+void tp_quench __P((struct inpcb *, int));
+void tp_netcmd __P((struct tp_pcb *, int));
+int tp_mask_to_num __P((u_char));
+void tp_mss __P((struct tp_pcb *, int));
+int tp_route_to __P((struct mbuf *, struct tp_pcb *, caddr_t));
+void tp0_stash __P((struct tp_pcb *, struct tp_event *));
+void tp0_openflow __P((struct tp_pcb *));
+int tp_setup_perf __P((struct tp_pcb *));
+void dump_addr __P((struct sockaddr *));
+void Dump_buf __P((caddr_t, int));
+
+/* tp_timer.c */
+void tp_timerinit __P((void));
+void tp_etimeout __P((struct tp_pcb *, int, int));
+void tp_euntimeout __P((struct tp_pcb *, int));
+void tp_slowtimo __P((void));
+void tp_data_retrans __P((struct tp_pcb *));
+void tp_fasttimo __P((void));
+void tp_ctimeout __P((struct tp_pcb *, int, int));
+void tp_ctimeout_MIN __P((struct tp_pcb *, int, int));
+void tp_cuntimeout __P((struct tp_pcb *, int));
+
+/* tp_trace.c */
+void tpTrace __P((struct tp_pcb *, u_int, u_int, u_int, u_int, u_int,
+ u_int));
+
+/* tp_usrreq.c */
+void dump_mbuf __P((struct mbuf *, char *));
+int tp_rcvoob __P((struct tp_pcb *, struct socket *, struct mbuf *,
+ int *, int));
+int tp_sendoob __P((struct tp_pcb *, struct socket *, struct mbuf *, int *));
+int tp_usrreq __P((struct socket *, int, struct mbuf *, struct mbuf *,
+ struct mbuf *));
+void tp_ltrace __P((struct socket *, struct uio *));
+int tp_confirm __P((struct tp_pcb *));
+int tp_snd_control __P((struct mbuf *, struct socket *, struct mbuf **));
+
+#ifdef TPCONS
+/* if_cons.c */
+void nibble_copy __P((char *, unsigned, char *, unsigned, int));
+int nibble_match __P((char *, unsigned, char *, unsigned, int));
+void cons_init __P((void));
+int tp_incoming __P((struct mbuf *, void *));
+int cons_tpinput __P((struct mbuf *, void *));
+int cons_connect __P((struct isopcb *));
+void *cons_ctlinput __P((int, struct sockaddr *, void *));
+int find_error_reason __P((struct x25_packet *));
+#endif
+
+#endif
-/* $NetBSD: tuba_subr.c,v 1.5 1995/11/21 01:07:54 cgd Exp $ */
+/* $OpenBSD: tuba_subr.c,v 1.3 1996/03/04 10:36:49 mickey Exp $ */
+/* $NetBSD: tuba_subr.c,v 1.7 1996/02/13 22:12:32 christos Exp $ */
/*
* Copyright (c) 1992, 1993
#include <netiso/iso_var.h>
#include <netiso/tuba_table.h>
-static struct sockaddr_iso null_siso = { sizeof(null_siso), AF_ISO, };
-extern int tuba_table_size, tcp_keepidle, tcp_keepintvl, tcp_maxidle;
-extern int tcppcbcachemiss, tcppredack, tcppreddat, tcprexmtthresh;
-extern struct tcpiphdr tcp_saveti;
-struct inpcbtable tuba_inpcb;
-struct inpcb *tuba_last_inpcb = 0;
-struct isopcb tuba_isopcb;
+#include <machine/stdarg.h>
+
+static struct sockaddr_iso null_siso = {sizeof(null_siso), AF_ISO,};
+extern int tuba_table_size, tcp_keepidle, tcp_keepintvl, tcp_maxidle;
+extern int tcppcbcachemiss, tcppredack, tcppreddat, tcprexmtthresh;
+extern struct tcpiphdr tcp_saveti;
+struct inpcbtable tuba_inpcb;
+struct isopcb tuba_isopcb;
+
+#ifndef TUBA_INPCBHASHSIZE
+#define TUBA_INPCBHASHSIZE 128
+#endif
+int tuba_inpcbhashsize = TUBA_INPCBHASHSIZE;
+
+
+struct addr_arg {
+ int error;
+ int offset;
+ u_long sum;
+};
+
+static void tuba_getaddr __P((struct addr_arg *, struct sockaddr_iso **,
+ u_long));
/*
* Tuba initialization
*/
#define TUBAHDRSIZE (3 /*LLC*/ + 9 /*CLNP Fixed*/ + 42 /*Addresses*/ \
+ 6 /*CLNP Segment*/ + 20 /*TCP*/)
- in_pcbinit(&tuba_inpcb);
+ in_pcbinit(&tuba_inpcb, tuba_inpcbhashsize);
tuba_isopcb.isop_next = tuba_isopcb.isop_prev = &tuba_isopcb;
tuba_isopcb.isop_faddr = &tuba_isopcb.isop_sfaddr;
tuba_isopcb.isop_laddr = &tuba_isopcb.isop_sladdr;
panic("tuba_init");
}
-struct addr_arg {
- int error;
- int offset;
- u_long sum;
-};
-
/*
* Calculate contribution to fudge factor for TCP checksum,
* and coincidentally set pointer for convenience of clnp_output
tuba_getaddr(arg, siso, index)
register struct addr_arg *arg;
struct sockaddr_iso **siso;
- u_long index;
+ u_long index;
{
register struct tuba_cache *tc;
if (index <= tuba_table_size && (tc = tuba_table[index])) {
if (siso)
*siso = &tc->tc_siso;
arg->sum += (arg->offset & 1 ? tc->tc_ssum : tc->tc_sum)
- + (0xffff ^ index);
+ + (0xffff ^ index);
arg->offset += tc->tc_siso.siso_nlen + 1;
} else
arg->error = 1;
}
+int
tuba_output(m, tp)
register struct mbuf *m;
- struct tcpcb *tp;
+ struct tcpcb *tp;
{
register struct tcpiphdr *n;
- struct isopcb *isop;
- struct addr_arg arg;
+ struct isopcb *isop;
+ struct addr_arg arg;
- if (tp == 0 || (n = tp->t_template) == 0 ||
- (isop = (struct isopcb *)tp->t_tuba_pcb) == 0) {
+ if (tp == 0 || (n = tp->t_template) == 0 ||
+ (isop = (struct isopcb *) tp->t_tuba_pcb) == 0) {
isop = &tuba_isopcb;
n = mtod(m, struct tcpiphdr *);
arg.error = arg.sum = arg.offset = 0;
}
if (n->ti_sum == 0) {
arg.error = arg.sum = arg.offset = 0;
- tuba_getaddr(&arg, (struct sockaddr_iso **)0, n->ti_dst.s_addr);
- tuba_getaddr(&arg, (struct sockaddr_iso **)0, n->ti_src.s_addr);
+ tuba_getaddr(&arg, (struct sockaddr_iso **) 0, n->ti_dst.s_addr);
+ tuba_getaddr(&arg, (struct sockaddr_iso **) 0, n->ti_src.s_addr);
REDUCE(arg.sum, arg.sum);
n->ti_sum = arg.sum;
n = mtod(m, struct tcpiphdr *);
- adjust:
+adjust:
if (arg.error) {
m_freem(m);
return (EADDRNOTAVAIL);
}
REDUCE(n->ti_sum, n->ti_sum + (0xffff ^ arg.sum));
}
- m->m_len -= sizeof (struct ip);
- m->m_pkthdr.len -= sizeof (struct ip);
- m->m_data += sizeof (struct ip);
+ m->m_len -= sizeof(struct ip);
+ m->m_pkthdr.len -= sizeof(struct ip);
+ m->m_data += sizeof(struct ip);
return (clnp_output(m, isop, m->m_pkthdr.len, 0));
}
+void
tuba_refcnt(isop, delta)
- struct isopcb *isop;
+ struct isopcb *isop;
+ int delta;
{
register struct tuba_cache *tc;
- unsigned index, sum;
+ unsigned index;
if (delta != 1)
delta = -1;
return;
isop->isop_tuba_cached = (delta == 1);
if ((index = tuba_lookup(isop->isop_faddr, M_DONTWAIT)) != 0 &&
- (tc = tuba_table[index]) != 0 && (delta == 1 || tc->tc_refcnt > 0))
+ (tc = tuba_table[index]) != 0 && (delta == 1 || tc->tc_refcnt > 0))
tc->tc_refcnt += delta;
if ((index = tuba_lookup(isop->isop_laddr, M_DONTWAIT)) != 0 &&
- (tc = tuba_table[index]) != 0 && (delta == 1 || tc->tc_refcnt > 0))
+ (tc = tuba_table[index]) != 0 && (delta == 1 || tc->tc_refcnt > 0))
tc->tc_refcnt += delta;
}
-tuba_pcbdetach(isop)
- struct isopcb *isop;
+void
+tuba_pcbdetach(v)
+ void *v;
{
+ struct isopcb *isop = v;
if (isop == 0)
return;
tuba_refcnt(isop, -1);
/*
* Avoid in_pcbconnect in faked out tcp_input()
*/
-tuba_pcbconnect(inp, nam)
- register struct inpcb *inp;
- struct mbuf *nam;
+int
+tuba_pcbconnect(v, nam)
+ void *v;
+ struct mbuf *nam;
{
+ register struct inpcb *inp = v;
register struct sockaddr_iso *siso;
struct sockaddr_in *sin = mtod(nam, struct sockaddr_in *);
- struct tcpcb *tp = intotcpcb(inp);
- struct isopcb *isop = (struct isopcb *)tp->t_tuba_pcb;
- int error;
+ struct tcpcb *tp = intotcpcb(inp);
+ struct isopcb *isop = (struct isopcb *) tp->t_tuba_pcb;
+ int error;
/* hardwire iso_pcbbind() here */
siso = isop->isop_laddr = &isop->isop_sladdr;
*siso = tuba_table[inp->inp_laddr.s_addr]->tc_siso;
siso->siso_tlen = sizeof(inp->inp_lport);
- bcopy((caddr_t)&inp->inp_lport, TSEL(siso), sizeof(inp->inp_lport));
+ bcopy((caddr_t) & inp->inp_lport, TSEL(siso), sizeof(inp->inp_lport));
/* hardwire in_pcbconnect() here without assigning route */
inp->inp_fport = sin->sin_port;
siso = mtod(nam, struct sockaddr_iso *);
*siso = tuba_table[inp->inp_faddr.s_addr]->tc_siso;
siso->siso_tlen = sizeof(inp->inp_fport);
- bcopy((caddr_t)&inp->inp_fport, TSEL(siso), sizeof(inp->inp_fport));
+ bcopy((caddr_t) & inp->inp_fport, TSEL(siso), sizeof(inp->inp_fport));
if ((error = iso_pcbconnect(isop, nam)) == 0)
tuba_refcnt(isop, 1);
* FUNCTION and ARGUMENTS:
* Take a packet (m) from clnp, strip off the clnp header
* and do tcp input processing.
- * No return value.
+ * No return value.
*/
-tuba_tcpinput(m, src, dst)
- register struct mbuf *m;
- struct sockaddr_iso *src, *dst;
+void
+#if __STDC__
+tuba_tcpinput(struct mbuf *m, ...)
+#else
+tuba_tcpinput(m, va_alist)
+ struct mbuf *m; /* ptr to first mbuf of pkt */
+ va_dcl
+#endif
{
- unsigned long sum, lindex, findex;
+ unsigned long lindex, findex;
register struct tcpiphdr *ti;
register struct inpcb *inp;
- caddr_t optp = NULL;
- int optlen;
- int len, tlen, off;
+ caddr_t optp = NULL;
+ int optlen = 0;
+ int len, tlen, off;
register struct tcpcb *tp = 0;
- int tiflags;
- struct socket *so;
- int todrop, acked, ourfinisacked, needoutput = 0;
- short ostate;
- struct in_addr laddr;
- int dropsocket = 0, iss = 0;
- u_long tiwin;
- u_int32_t ts_val, ts_ecr;
- int ts_present = 0;
+ int tiflags;
+ struct socket *so = NULL;
+ int todrop, acked, ourfinisacked, needoutput = 0;
+ short ostate = 0;
+ struct in_addr laddr;
+ int dropsocket = 0, iss = 0;
+ u_long tiwin;
+ u_int32_t ts_val, ts_ecr;
+ int ts_present = 0;
+ struct sockaddr_iso *src, *dst;
+ va_list ap;
+
+ va_start(ap, m);
+ src = va_arg(ap, struct sockaddr_iso *);
+ dst = va_arg(ap, struct sockaddr_iso *);
+ va_end(ap);
+
if ((m->m_flags & M_PKTHDR) == 0)
panic("tuba_tcpinput");
m->m_data -= sizeof(struct ip);
m->m_len += sizeof(struct ip);
m->m_pkthdr.len += sizeof(struct ip);
- m->m_flags &= ~(M_MCAST|M_BCAST); /* XXX should do this in clnp_input */
+ m->m_flags &= ~(M_MCAST | M_BCAST); /* XXX should do this in
+ * clnp_input */
/*
* The reassembly code assumes it will be overwriting a useless
* part of the packet, which is why we need to have it point
* so that we can save copying the tcp header.
* This code knows way too much about the structure of mbufs!
*/
- off = ((sizeof (long) - 1) & ((m->m_flags & M_EXT) ?
- (m->m_data - m->m_ext.ext_buf) : (m->m_data - m->m_pktdat)));
+ off = ((sizeof(long) - 1) & ((m->m_flags & M_EXT) ?
+ (m->m_data - m->m_ext.ext_buf) : (m->m_data - m->m_pktdat)));
if (off || len < sizeof(struct tcphdr)) {
- struct mbuf *m0 = m;
+ struct mbuf *m0 = m;
MGETHDR(m, M_DONTWAIT, MT_DATA);
- if (m == 0) {
+ if (m == 0) {
m = m0;
goto drop;
}
ti->ti_src.s_addr = tuba_table[findex]->tc_ssum;
bzero(ti->ti_x1, sizeof ti->ti_x1);
ti->ti_pr = ISOPROTO_TCP;
- ti->ti_len = htons((u_short)tlen);
- if (ti->ti_sum = in_cksum(m, m->m_pkthdr.len)) {
+ ti->ti_len = htons((u_short) tlen);
+ if ((ti->ti_sum = in_cksum(m, m->m_pkthdr.len)) != 0) {
tcpstat.tcps_rcvbadsum++;
goto drop;
}
#define TUBA_INCLUDE
#define in_pcbconnect tuba_pcbconnect
#define tcb tuba_inpcb
-#define tcp_last_inpcb tuba_last_inpcb
#include <netinet/tcp_input.c>
}
-/* $NetBSD: tuba_table.c,v 1.5 1995/10/16 05:28:58 mycroft Exp $ */
+/* $OpenBSD: tuba_table.c,v 1.3 1996/03/04 10:36:50 mickey Exp $ */
+/* $NetBSD: tuba_table.c,v 1.6 1996/02/13 22:12:34 christos Exp $ */
/*
* Copyright (c) 1992, 1993
#include <netiso/iso.h>
#include <netiso/tuba_table.h>
-int tuba_table_size;
-struct tuba_cache **tuba_table;
-struct radix_node_head *tuba_tree;
-extern int arpt_keep, arpt_prune; /* use same values as arp cache */
+int tuba_table_size;
+struct tuba_cache **tuba_table;
+struct radix_node_head *tuba_tree;
+extern int arpt_keep, arpt_prune; /* use same values as arp cache */
void
-tuba_timer()
+tuba_timer(v)
+ void *v;
{
- int s = splsoftnet();
- int i;
- register struct tuba_cache *tc;
- long timelimit = time.tv_sec - arpt_keep;
+ int s = splsoftnet();
+ int i;
+ register struct tuba_cache *tc;
+ long timelimit = time.tv_sec - arpt_keep;
- timeout(tuba_timer, (caddr_t)0, arpt_prune * hz);
+ timeout(tuba_timer, (caddr_t) 0, arpt_prune * hz);
for (i = tuba_table_size; i > 0; i--)
if ((tc = tuba_table[i]) && (tc->tc_refcnt == 0) &&
(tc->tc_time < timelimit)) {
tuba_table[i] = 0;
rn_delete(&tc->tc_siso.siso_addr, NULL, tuba_tree);
- free((caddr_t)tc, M_RTABLE);
+ free((caddr_t) tc, M_RTABLE);
}
splx(s);
}
+void
tuba_table_init()
{
- rn_inithead((void **)&tuba_tree, 40);
- timeout(tuba_timer, (caddr_t)0, arpt_prune * hz);
+ rn_inithead((void **) &tuba_tree, 40);
+ timeout(tuba_timer, (caddr_t) 0, arpt_prune * hz);
}
int
tuba_lookup(siso, wait)
register struct sockaddr_iso *siso;
+ int wait;
{
- struct radix_node *rn, *rn_match();
+ struct radix_node *rn;
register struct tuba_cache *tc;
struct tuba_cache **new;
- int dupentry = 0, sum_a = 0, sum_b = 0, old_size, i;
+ int dupentry = 0, sum_a = 0, sum_b = 0, old_size, i;
- if ((rn = rn_match((caddr_t)&siso->siso_addr, tuba_tree))
- && ((rn->rn_flags & RNF_ROOT) == 0)) {
- tc = (struct tuba_cache *)rn;
+ if ((rn = rn_match((caddr_t) &siso->siso_addr, tuba_tree)) != NULL
+ && ((rn->rn_flags & RNF_ROOT) == 0)) {
+ tc = (struct tuba_cache *) rn;
tc->tc_time = time.tv_sec;
return (tc->tc_index);
}
- if ((tc = (struct tuba_cache *)malloc(sizeof(*tc), M_RTABLE, wait))
- == NULL)
+ if ((tc = (struct tuba_cache *) malloc(sizeof(*tc), M_RTABLE, wait))
+ == NULL)
return (0);
- bzero((caddr_t)tc, sizeof (*tc));
+ bzero((caddr_t) tc, sizeof(*tc));
bcopy(siso->siso_data, tc->tc_siso.siso_data,
- tc->tc_siso.siso_nlen = siso->siso_nlen);
+ tc->tc_siso.siso_nlen = siso->siso_nlen);
rn_insert(&tc->tc_siso.siso_addr, tuba_tree, &dupentry, tc->tc_nodes);
if (dupentry)
panic("tuba_lookup 1");
tc->tc_siso.siso_family = AF_ISO;
tc->tc_siso.siso_len = sizeof(tc->tc_siso);
tc->tc_time = time.tv_sec;
- for (i = sum_a = tc->tc_siso.siso_nlen; --i >= 0; )
+ for (i = sum_a = tc->tc_siso.siso_nlen; --i >= 0;)
if (i & 1)
- sum_a += (u_char)tc->tc_siso.siso_data[i];
+ sum_a += (u_char) tc->tc_siso.siso_data[i];
else
- sum_b += (u_char)tc->tc_siso.siso_data[i];
+ sum_b += (u_char) tc->tc_siso.siso_data[i];
REDUCE(tc->tc_sum, (sum_a << 8) + sum_b);
HTONS(tc->tc_sum);
SWAB(tc->tc_ssum, tc->tc_sum);
return (0);
tuba_table_size = 1 + 2 * tuba_table_size;
i = (tuba_table_size + 1) * sizeof(tc);
- new = (struct tuba_cache **)malloc((unsigned)i, M_RTABLE, wait);
+ new = (struct tuba_cache **) malloc((unsigned) i, M_RTABLE, wait);
if (new == 0) {
tuba_table_size = old_size;
rn_delete(&tc->tc_siso.siso_addr, NULL, tuba_tree);
- free((caddr_t)tc, M_RTABLE);
+ free((caddr_t) tc, M_RTABLE);
return (0);
}
- bzero((caddr_t)new, (unsigned)i);
+ bzero((caddr_t) new, (unsigned) i);
if (tuba_table) {
- bcopy((caddr_t)tuba_table, (caddr_t)new, i >> 1);
- free((caddr_t)tuba_table, M_RTABLE);
+ bcopy((caddr_t) tuba_table, (caddr_t) new, i >> 1);
+ free((caddr_t) tuba_table, M_RTABLE);
}
tuba_table = new;
i = tuba_table_size;
-/* $NetBSD: tuba_table.h,v 1.3 1995/03/26 20:35:36 jtc Exp $ */
+/* $OpenBSD: tuba_table.h,v 1.2 1996/03/04 10:36:52 mickey Exp $ */
+/* $NetBSD: tuba_table.h,v 1.4 1996/02/13 22:12:37 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
*/
struct tuba_cache {
- struct radix_node tc_nodes[2]; /* convenient lookup */
- int tc_refcnt;
- int tc_time; /* last looked up */
- int tc_flags;
+ struct radix_node tc_nodes[2]; /* convenient lookup */
+ int tc_refcnt;
+ int tc_time;/* last looked up */
+ int tc_flags;
#define TCF_PERM 1
- int tc_index;
- u_short tc_sum; /* cksum of nsap inc. length */
- u_short tc_ssum; /* swab(tc_sum) */
- struct sockaddr_iso tc_siso; /* for responding */
+ int tc_index;
+ u_short tc_sum; /* cksum of nsap inc. length */
+ u_short tc_ssum;/* swab(tc_sum) */
+ struct sockaddr_iso tc_siso; /* for responding */
};
#define ADDCARRY(x) (x >= 65535 ? x -= 65535 : x)
s.s = (b); t = s.c[0]; s.c[0] = s.c[1]; s.c[1] = t; a = s.s;}
#ifdef _KERNEL
-extern int tuba_table_size;
-extern struct tuba_cache **tuba_table;
-extern struct radix_node_head *tuba_tree;
+extern int tuba_table_size;
+extern struct tuba_cache **tuba_table;
+extern struct radix_node_head *tuba_tree;
+
+struct mbuf;
+struct tcpcb;
+struct isopcb;
+struct inpcb;
+struct sockaddr_iso;
+struct socket;
+
+/* tuba_subr.c */
+void tuba_init __P((void));
+int tuba_output __P((struct mbuf *, struct tcpcb *));
+void tuba_refcnt __P((struct isopcb *, int ));
+void tuba_pcbdetach __P((void *));
+int tuba_pcbconnect __P((void *, struct mbuf *));
+void tuba_tcpinput __P((struct mbuf *, ...));
+int tuba_pcbconnect __P((void *, struct mbuf *));
+void tuba_slowtimo __P((void));
+void tuba_fasttimo __P((void));
+
+/* tuba_table.c */
+void tuba_timer __P((void *));
+void tuba_table_init __P((void));
+int tuba_lookup __P((struct sockaddr_iso *, int ));
+
+/* tuba_usrreq.c */
+int tuba_usrreq __P((struct socket *, int, struct mbuf *, struct mbuf *,
+ struct mbuf *));
+int tuba_ctloutput __P((int, struct socket *, int, int , struct mbuf **));
#endif
-/* $NetBSD: tuba_usrreq.c,v 1.7 1995/08/12 23:59:55 mycroft Exp $ */
+/* $OpenBSD: tuba_usrreq.c,v 1.2 1996/03/04 10:36:54 mickey Exp $ */
+/* $NetBSD: tuba_usrreq.c,v 1.8 1996/02/13 22:12:40 christos Exp $ */
/*
* Copyright (c) 1992, 1993
/*
* TCP protocol interface to socket abstraction.
*/
-extern char *tcpstates[];
-extern struct inpcbtable tuba_inpcb;
-extern struct isopcb tuba_isopcb;
+extern char *tcpstates[];
+extern struct inpcbtable tuba_inpcb;
+extern struct isopcb tuba_isopcb;
/*
* Process a TCP user request for TCP tb. If this is a send request
* then m is the mbuf chain of send data. If this is a timer expiration
* (called from the software clock routine), then timertype tells which timer.
*/
-/*ARGSUSED*/
+/* ARGSUSED */
+int
tuba_usrreq(so, req, m, nam, control)
- struct socket *so;
- int req;
- struct mbuf *m, *nam, *control;
+ struct socket *so;
+ int req;
+ struct mbuf *m, *nam, *control;
{
register struct inpcb *inp;
- register struct isopcb *isop;
- register struct tcpcb *tp;
- int s;
- int error = 0;
- int ostate;
+ register struct isopcb *isop = NULL;
+ register struct tcpcb *tp = NULL;
+ int s;
+ int error = 0;
+ int ostate;
struct sockaddr_iso *siso;
if (req == PRU_CONTROL)
- return (iso_control(so, (long)m, (caddr_t)nam,
- (struct ifnet *)control));
+ return (iso_control(so, (long) m, (caddr_t) nam,
+ (struct ifnet *) control));
s = splsoftnet();
inp = sotoinpcb(so);
* a (struct inpcb) pointed at by the socket, and this
* structure will point at a subsidary (struct tcpcb).
*/
- if (inp == 0 && req != PRU_ATTACH) {
+ if (inp == 0 && req != PRU_ATTACH) {
splx(s);
- return (EINVAL); /* XXX */
+ return (EINVAL);/* XXX */
}
if (inp) {
tp = intotcpcb(inp);
if (tp == 0)
panic("tuba_usrreq");
ostate = tp->t_state;
- isop = (struct isopcb *)tp->t_tuba_pcb;
+ isop = (struct isopcb *) tp->t_tuba_pcb;
if (isop == 0)
panic("tuba_usrreq 2");
} else
ostate = 0;
switch (req) {
- /*
- * TCP attaches to socket via PRU_ATTACH, reserving space,
- * and an internet control block. We also need to
- * allocate an isopcb and separate the control block from
- * tcp/ip ones.
- */
+ /*
+ * TCP attaches to socket via PRU_ATTACH, reserving space,
+ * and an internet control block. We also need to
+ * allocate an isopcb and separate the control block from
+ * tcp/ip ones.
+ */
case PRU_ATTACH:
- if (error = iso_pcballoc(so, &tuba_isopcb))
+ if ((error = iso_pcballoc(so, &tuba_isopcb)) != 0)
break;
- isop = (struct isopcb *)so->so_pcb;
+ isop = (struct isopcb *) so->so_pcb;
so->so_pcb = 0;
- if (error = tcp_usrreq(so, req, m, nam, control)) {
+ if ((error = tcp_usrreq(so, req, m, nam, control)) != 0) {
isop->isop_socket = 0;
iso_pcbdetach(isop);
} else {
inp = sotoinpcb(so);
CIRCLEQ_REMOVE(&inp->inp_table->inpt_queue, inp,
- inp_queue);
+ inp_queue);
CIRCLEQ_INSERT_HEAD(&tuba_inpcb.inpt_queue, inp,
- inp_queue);
+ inp_queue);
inp->inp_table = &tuba_inpcb;
tp = intotcpcb(inp);
if (tp == 0)
}
goto notrace;
- /*
- * PRU_DETACH detaches the TCP protocol from the socket.
- * If the protocol state is non-embryonic, then can't
- * do this directly: have to initiate a PRU_DISCONNECT,
- * which may finish later; embryonic TCB's can just
- * be discarded here.
- */
+ /*
+ * PRU_DETACH detaches the TCP protocol from the socket.
+ * If the protocol state is non-embryonic, then can't
+ * do this directly: have to initiate a PRU_DISCONNECT,
+ * which may finish later; embryonic TCB's can just
+ * be discarded here.
+ */
case PRU_DETACH:
if (tp->t_state > TCPS_LISTEN)
tp = tcp_disconnect(tp);
tuba_pcbdetach(isop);
break;
- /*
- * Give the socket an address.
- */
+ /*
+ * Give the socket an address.
+ */
case PRU_BIND:
siso = mtod(nam, struct sockaddr_iso *);
if (siso->siso_tlen && siso->siso_tlen != 2) {
error = EINVAL;
break;
}
- if ((error = iso_pcbbind(isop, nam)) ||
+ if ((error = iso_pcbbind(isop, nam)) ||
(siso = isop->isop_laddr) == 0)
break;
bcopy(TSEL(siso), &inp->inp_lport, 2);
error = ENOBUFS;
break;
- /*
- * Prepare to accept connections.
- */
+ /*
+ * Prepare to accept connections.
+ */
case PRU_CONNECT:
case PRU_LISTEN:
if (inp->inp_lport == 0 &&
- (error = iso_pcbbind(isop, (struct mbuf *)0)))
+ (error = iso_pcbbind(isop, NULL)))
break;
bcopy(TSEL(isop->isop_laddr), &inp->inp_lport, 2);
if (req == PRU_LISTEN) {
tp->t_state = TCPS_LISTEN;
break;
}
- /*FALLTHROUGH*/
- /*
- * Initiate connection to peer.
- * Create a template for use in transmissions on this connection.
- * Enter SYN_SENT state, and mark socket as connecting.
- * Start keep-alive timer, and seed output sequence space.
- * Send initial segment on connection.
- */
- /* case PRU_CONNECT: */
- if (error = iso_pcbconnect(isop, nam))
+ /* FALLTHROUGH */
+ /*
+ * Initiate connection to peer.
+ * Create a template for use in transmissions on this connection.
+ * Enter SYN_SENT state, and mark socket as connecting.
+ * Start keep-alive timer, and seed output sequence space.
+ * Send initial segment on connection.
+ */
+ /* case PRU_CONNECT: */
+ if ((error = iso_pcbconnect(isop, nam)) != 0)
break;
if ((siso = isop->isop_laddr) && siso->siso_nlen > 1)
siso->siso_data[siso->siso_nlen - 1] = ISOPROTO_TCP;
panic("tuba_usrreq: connect");
siso = mtod(nam, struct sockaddr_iso *);
if (!(inp->inp_faddr.s_addr = tuba_lookup(siso, M_WAITOK))) {
- unconnect:
+ unconnect:
iso_pcbdisconnect(isop);
error = ENOBUFS;
break;
}
bcopy(TSEL(isop->isop_faddr), &inp->inp_fport, 2);
if (inp->inp_laddr.s_addr == 0 &&
- (inp->inp_laddr.s_addr =
- tuba_lookup(isop->isop_laddr, M_WAITOK)) == 0)
+ (inp->inp_laddr.s_addr =
+ tuba_lookup(isop->isop_laddr, M_WAITOK)) == 0)
goto unconnect;
if ((tp->t_template = tcp_template(tp)) == 0)
goto unconnect;
tcpstat.tcps_connattempt++;
tp->t_state = TCPS_SYN_SENT;
tp->t_timer[TCPT_KEEP] = TCPTV_KEEP_INIT;
- tp->iss = tcp_iss; tcp_iss += TCP_ISSINCR/2;
+ tp->iss = tcp_iss;
+ tcp_iss += TCP_ISSINCR / 2;
tcp_sendseqinit(tp);
error = tcp_output(tp);
tuba_refcnt(isop, 1);
break;
- /*
- * Initiate disconnect from peer.
- * If connection never passed embryonic stage, just drop;
- * else if don't need to let data drain, then can just drop anyways,
- * else have to begin TCP shutdown process: mark socket disconnecting,
- * drain unread data, state switch to reflect user close, and
- * send segment (e.g. FIN) to peer. Socket will be really disconnected
- * when peer sends FIN and acks ours.
- *
- * SHOULD IMPLEMENT LATER PRU_CONNECT VIA REALLOC TCPCB.
- */
+ /*
+ * Initiate disconnect from peer.
+ * If connection never passed embryonic stage, just drop;
+ * else if don't need to let data drain, then can just drop anyways,
+ * else have to begin TCP shutdown process: mark socket disconnecting,
+ * drain unread data, state switch to reflect user close, and
+ * send segment (e.g. FIN) to peer. Socket will be really disconnected
+ * when peer sends FIN and acks ours.
+ *
+ * SHOULD IMPLEMENT LATER PRU_CONNECT VIA REALLOC TCPCB.
+ */
case PRU_DISCONNECT:
if ((tp = tcp_disconnect(tp)) == 0)
tuba_pcbdetach(isop);
break;
- /*
- * Accept a connection. Essentially all the work is
- * done at higher levels; just return the address
- * of the peer, storing through addr.
- */
+ /*
+ * Accept a connection. Essentially all the work is
+ * done at higher levels; just return the address
+ * of the peer, storing through addr.
+ */
case PRU_ACCEPT:
- bcopy((caddr_t)isop->isop_faddr, mtod(nam, caddr_t),
- nam->m_len = isop->isop_faddr->siso_len);
+ bcopy((caddr_t) isop->isop_faddr, mtod(nam, caddr_t),
+ nam->m_len = isop->isop_faddr->siso_len);
break;
- /*
- * Mark the connection as being incapable of further output.
- */
+ /*
+ * Mark the connection as being incapable of further output.
+ */
case PRU_SHUTDOWN:
socantsendmore(so);
tp = tcp_usrclosed(tp);
else
tuba_pcbdetach(isop);
break;
- /*
- * Abort the TCP.
- */
+ /*
+ * Abort the TCP.
+ */
case PRU_ABORT:
if ((tp = tcp_drop(tp, ECONNABORTED)) == 0)
tuba_pcbdetach(isop);
case PRU_SOCKADDR:
if (isop->isop_laddr)
- bcopy((caddr_t)isop->isop_laddr, mtod(nam, caddr_t),
- nam->m_len = isop->isop_laddr->siso_len);
+ bcopy((caddr_t) isop->isop_laddr, mtod(nam, caddr_t),
+ nam->m_len = isop->isop_laddr->siso_len);
break;
case PRU_PEERADDR:
if (isop->isop_faddr)
- bcopy((caddr_t)isop->isop_faddr, mtod(nam, caddr_t),
- nam->m_len = isop->isop_faddr->siso_len);
+ bcopy((caddr_t) isop->isop_faddr, mtod(nam, caddr_t),
+ nam->m_len = isop->isop_faddr->siso_len);
break;
default:
goto notrace;
}
if (tp && (so->so_options & SO_DEBUG))
- tcp_trace(TA_USER, ostate, tp, (struct tcpiphdr *)0, req);
+ tcp_trace(TA_USER, ostate, tp, (struct tcpiphdr *) 0, req);
notrace:
splx(s);
- return(error);
+ return (error);
}
+int
tuba_ctloutput(op, so, level, optname, mp)
- int op;
- struct socket *so;
- int level, optname;
- struct mbuf **mp;
+ int op;
+ struct socket *so;
+ int level, optname;
+ struct mbuf **mp;
{
- int clnp_ctloutput(), tcp_ctloutput();
-
- return ((level != IPPROTO_TCP ? clnp_ctloutput : tcp_ctloutput)
- (op, so, level, optname, mp));
+ if (level != IPPROTO_TCP)
+ return rclnp_ctloutput(op, so, level, optname, mp);
+ else
+ return tcp_ctloutput(op, so, level, optname, mp);
}
+# $OpenBSD: Makefile,v 1.2 1996/03/04 10:37:00 mickey Exp $
# $NetBSD: Makefile,v 1.5 1994/06/29 06:40:59 cgd Exp $
# @(#)Makefile 5.16 (Berkeley) 4/26/91
+/* $OpenBSD: debug.h,v 1.2 1996/03/04 10:37:01 mickey Exp $ */
/* $NetBSD: debug.h,v 1.4 1994/06/29 06:41:00 cgd Exp $ */
#define OUT stdout
+/* $OpenBSD: llparse.c,v 1.2 1996/03/04 10:37:03 mickey Exp $ */
/* $NetBSD: llparse.c,v 1.4 1994/06/29 06:41:02 cgd Exp $ */
/*
+/* $OpenBSD: llparse.h,v 1.2 1996/03/04 10:37:05 mickey Exp $ */
/* $NetBSD: llparse.h,v 1.4 1994/06/29 06:41:04 cgd Exp $ */
/************************************************************
+/* $OpenBSD: llscan.c,v 1.2 1996/03/04 10:37:07 mickey Exp $ */
/* $NetBSD: llscan.c,v 1.5 1994/06/29 06:41:05 cgd Exp $ */
/*
+/* $OpenBSD: main.c,v 1.2 1996/03/04 10:37:09 mickey Exp $ */
/* $NetBSD: main.c,v 1.5 1994/06/29 06:41:07 cgd Exp $ */
/*
+/* $OpenBSD: main.h,v 1.2 1996/03/04 10:37:10 mickey Exp $ */
/* $NetBSD: main.h,v 1.4 1994/06/29 06:41:08 cgd Exp $ */
#define TRUE 1
+/* $OpenBSD: malloc.c,v 1.2 1996/03/04 10:37:12 mickey Exp $ */
/* $NetBSD: malloc.c,v 1.4 1994/06/29 06:41:10 cgd Exp $ */
/*
+/* $OpenBSD: malloc.h,v 1.2 1996/03/04 10:37:13 mickey Exp $ */
/* $NetBSD: malloc.h,v 1.4 1994/06/29 06:41:11 cgd Exp $ */
char *Malloc();
+/* $OpenBSD: procs.c,v 1.2 1996/03/04 10:37:16 mickey Exp $ */
/* $NetBSD: procs.c,v 1.4 1994/06/29 06:41:12 cgd Exp $ */
/*
+/* $OpenBSD: procs.h,v 1.2 1996/03/04 10:37:18 mickey Exp $ */
/* $NetBSD: procs.h,v 1.4 1994/06/29 06:41:13 cgd Exp $ */
extern char *stash();
+/* $OpenBSD: putdriver.c,v 1.2 1996/03/04 10:37:20 mickey Exp $ */
/* $NetBSD: putdriver.c,v 1.4 1994/06/29 06:41:15 cgd Exp $ */
/*
+/* $OpenBSD: sets.c,v 1.2 1996/03/04 10:37:22 mickey Exp $ */
/* $NetBSD: sets.c,v 1.4 1994/06/29 06:41:16 cgd Exp $ */
/*
+/* $OpenBSD: sets.h,v 1.2 1996/03/04 10:37:24 mickey Exp $ */
/* $NetBSD: sets.h,v 1.4 1994/06/29 06:41:17 cgd Exp $ */
#define MAXEVENTS 200
+/* $OpenBSD: test.trans,v 1.2 1996/03/04 10:37:25 mickey Exp $ */
/* $NetBSD: test.trans,v 1.4 1994/06/29 06:41:18 cgd Exp $ */
*PROTOCOL test
+/* $OpenBSD: test_def.h,v 1.2 1996/03/04 10:37:26 mickey Exp $ */
/* $NetBSD: test_def.h,v 1.4 1994/06/29 06:41:20 cgd Exp $ */
struct blah {
+/* $OpenBSD: xebec.bnf,v 1.2 1996/03/04 10:37:28 mickey Exp $ */
/* $NetBSD: xebec.bnf,v 1.4 1994/06/29 06:41:22 cgd Exp $ */
#include "main.h"
+/* $OpenBSD: xebec.c,v 1.2 1996/03/04 10:37:30 mickey Exp $ */
/* $NetBSD: xebec.c,v 1.4 1994/06/29 06:41:23 cgd Exp $ */
#include "xebec.h"
+/* $OpenBSD: xebec.h,v 1.2 1996/03/04 10:37:31 mickey Exp $ */
/* $NetBSD: xebec.h,v 1.4 1994/06/29 06:41:25 cgd Exp $ */
union llattrib {