summaryrefslogtreecommitdiffstats
path: root/sys/contrib/ngatm/netnatm/saal/sscoppriv.h
diff options
context:
space:
mode:
Diffstat (limited to 'sys/contrib/ngatm/netnatm/saal/sscoppriv.h')
-rw-r--r--sys/contrib/ngatm/netnatm/saal/sscoppriv.h318
1 files changed, 318 insertions, 0 deletions
diff --git a/sys/contrib/ngatm/netnatm/saal/sscoppriv.h b/sys/contrib/ngatm/netnatm/saal/sscoppriv.h
new file mode 100644
index 0000000..e2b0555
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/saal/sscoppriv.h
@@ -0,0 +1,318 @@
+/*
+ * Copyright (c) 1996-2003
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Author: Hartmut Brandt <harti@freebsd.org>
+ *
+ * $Begemot: libunimsg/netnatm/saal/sscoppriv.h,v 1.4 2004/07/08 08:22:17 brandt Exp $
+ *
+ * Private SSCOP definitions.
+ *
+ */
+#ifdef _KERNEL
+#ifdef __FreeBSD__
+#include <netgraph/atm/sscop/ng_sscop_cust.h>
+#endif
+#else /* !_KERNEL */
+#include "sscopcust.h"
+#endif
+
+/* Argh. BSDi */
+#ifndef _BYTE_ORDER
+#ifndef BYTE_ORDER
+#error "_BYTE_ORDER not defined"
+#endif
+#define _BYTE_ORDER BYTE_ORDER
+#define _LITTLE_ENDIAN LITTLE_ENDIAN
+#define _BIG_ENDIAN BIG_ENDIAN
+#endif
+
+/*
+ * PDU trailer
+ */
+union pdu {
+ u_int sscop_null;
+ struct {
+#if _BYTE_ORDER == _BIG_ENDIAN
+ u_int pl : 2; /* pad length */
+ u_int : 1; /* reserved field */
+ u_int s : 1; /* source */
+ u_int type : 4; /* PDU type */
+ u_int ns : 24; /* sequence number */
+#else
+ u_int ns : 24; /* sequence number */
+ u_int type : 4; /* PDU type */
+ u_int s : 1; /* source */
+ u_int : 1; /* reserved field */
+ u_int pl : 2; /* pad length */
+#endif
+ } ss;
+};
+#define sscop_pl ss.pl
+#define sscop_s ss.s
+#define sscop_type ss.type
+#define sscop_ns ss.ns
+
+/*
+ * seqno list entry format
+ */
+union seqno {
+ u_int sscop_null;
+ struct {
+#if _BYTE_ORDER == _BIG_ENDIAN
+ u_int : 8; /* pad */
+ u_int n : 24; /* seqno */
+#else
+ u_int n : 24; /* seqno */
+ u_int : 8; /* pad */
+#endif
+ } ss;
+};
+#define sscop_n ss.n
+
+/*
+ * Begin pdu
+ */
+union bgn {
+ u_int sscop_null;
+ struct {
+#if _BYTE_ORDER == _BIG_ENDIAN
+ u_int : 24; /* reserved */
+ u_int bgns : 8; /* VT_MR */
+#else
+ u_int bgns : 8; /* VT_MR */
+ u_int : 24; /* reserved */
+#endif
+ } ss;
+};
+#define sscop_bgns ss.bgns
+
+/*
+ * pdu types
+ */
+enum pdu_type {
+ PDU_BGN = 0x1, /* request initialization */
+ PDU_BGAK = 0x2, /* request acknowledgement */
+ PDU_END = 0x3, /* disconnect command */
+ PDU_ENDAK = 0x4, /* disconnect acknowledgement */
+ PDU_RS = 0x5, /* resynchronisation command */
+ PDU_RSAK = 0x6, /* resynchronisation acknowledgement */
+ PDU_BGREJ = 0x7, /* connection reject */
+ PDU_SD = 0x8, /* sequenced connection-mode data */
+ PDU_ER = 0x9, /* recovery command */
+ PDU_POLL = 0xa, /* xmit state info with req. for recv state */
+ PDU_STAT = 0xb, /* solicited receiver state info */
+ PDU_USTAT = 0xc, /* unsolicited receiver state info */
+ PDU_UD = 0xd, /* unumbered user data */
+ PDU_MD = 0xe, /* unumbered management data */
+ PDU_ERAK = 0xf, /* recovery acknowledgement */
+};
+
+
+/*
+ * These are all signals, that are used by SSCOP. Don't change the order or
+ * number without also changing the associated tables.
+ */
+enum sscop_sigtype {
+ /* received PDU's */
+ SIG_BGN, /* request initialization */
+ SIG_BGAK, /* request acknowledgement */
+ SIG_END, /* disconnect command */
+ SIG_ENDAK, /* disconnect acknowledgement */
+ SIG_RS, /* resynchronisation command */
+ SIG_RSAK, /* resynchronisation acknowledgement */
+ SIG_BGREJ, /* connection reject */
+ SIG_SD, /* sequenced connection-mode data */
+ SIG_ER, /* recovery command */
+ SIG_POLL, /* xmitter state info with req for recv state */
+ SIG_STAT, /* solicited receiver state info */
+ SIG_USTAT, /* unsolicited receiver state info */
+ SIG_UD, /* unumbered user data */
+ SIG_MD, /* unumbered management data */
+ SIG_ERAK, /* recovery acknoledgement */
+
+ /* timer expiry */
+ SIG_T_CC, /* CC timer */
+ SIG_T_POLL, /* POLL timer */
+ SIG_T_KA, /* KEEP ALIVE timer */
+ SIG_T_NR, /* NO RESPONSE timer */
+ SIG_T_IDLE, /* IDLE timer */
+
+ /* user originated signals */
+ SIG_PDU_Q, /* PDU enqueued pseudosignal */
+ SIG_USER_DATA, /* user data request */
+ SIG_ESTAB_REQ, /* establish connection request */
+ SIG_ESTAB_RESP, /* establish connection response */
+ SIG_RELEASE_REQ, /* release connection request */
+ SIG_RECOVER, /* automatic recover response */
+ SIG_SYNC_REQ, /* resynchronisation request */
+ SIG_SYNC_RESP, /* resynchronisation response */
+ SIG_UDATA, /* UDATA request */
+ SIG_MDATA, /* MDATA request */
+ SIG_UPDU_Q, /* UDATA PDU enqueued pseudosignal */
+ SIG_MPDU_Q, /* MDATA PDU enqueued pseudosignal */
+ SIG_RETRIEVE, /* RETRIEVE */
+
+ /* number of signals */
+ SIG_NUM
+};
+
+/*
+ * This is a message as contained in a sscop message queue. It holds a pointer
+ * to the real message.
+ */
+struct sscop_msg {
+ sscop_msgq_link_t link;
+ u_int seqno; /* seq no */
+ u_int poll_seqno; /* poll seqno (for messages in xmit buffer) */
+ u_int rexmit; /* in retransmission queue? */
+ struct SSCOP_MBUF_T *m; /* the message */
+};
+
+/*
+ * This structure is used to hold signals in the signal queue
+ */
+struct sscop_sig {
+ sscop_sigq_link_t link; /* next signal */
+ enum sscop_sigtype sig; /* THE signal */
+ struct sscop_msg *msg; /* signal argument (message) */
+};
+
+/*
+ * This structure holds the entire sscop state
+ */
+struct sscop {
+ enum sscop_state state; /* current state */
+ const struct sscop_funcs *funcs;
+
+ /* send state */
+ u_int vt_s; /* seqno for next pdu first time transmitted */
+ u_int vt_ps; /* current poll seqno */
+ u_int vt_a; /* next expected in-sequence sd pdu */
+ u_int vt_pa; /* poll seqno of next stat pdu */
+ u_int vt_ms; /* maximum allowed send sd seqno */
+ u_int vt_pd; /* poll data state */
+ u_int vt_cc; /* connection control state */
+ u_int vt_sq; /* transmitter connection sequence */
+
+ /* receive state */
+ u_int vr_r; /* receive state */
+ u_int vr_h; /* highes expected state */
+ u_int vr_mr; /* maximum acceptable */
+ u_int vr_sq; /* receiver connection state */
+
+ /* timers */
+ sscop_timer_t t_cc; /* timer_CC */
+ sscop_timer_t t_nr; /* timer_NO_RESPONSE */
+ sscop_timer_t t_ka; /* timer KEEP_ALIVE */
+ sscop_timer_t t_poll; /* timer_POLL */
+ sscop_timer_t t_idle; /* idle timer */
+
+ /* maximum values */
+ u_int maxj; /* maximum uu-info */
+ u_int maxk; /* maximum info */
+ u_int maxcc; /* maximum number of bgn, end, er and rs */
+ u_int maxpd; /* maximum value of vt_pd */
+ u_int maxstat; /* maximum length of list */
+ u_int timercc; /* connection control timer */
+ u_int timerka; /* keep alive timer */
+ u_int timernr; /* no response timer */
+ u_int timerpoll; /* polling */
+ u_int timeridle; /* idle timer */
+ u_int robustness; /* atmf/97-0216 robustness enhancement */
+ u_int poll_after_rex; /* optional POLL after re-transmission */
+ u_int mr; /* initial window */
+
+ /*
+ * buffers and queues.
+ * All expect the xq hold SD PDUs.
+ */
+ sscop_msgq_head_t xq; /* xmit queue (input from user before xmit) */
+ sscop_msgq_head_t uxq; /* UD xmit queue */
+ sscop_msgq_head_t mxq; /* MD xmit queue */
+ sscop_msgq_head_t xbuf; /* transmission buffer (SD PDUs transmitted) */
+ int rxq; /* number of PDUs in retransmission queue */
+ sscop_msgq_head_t rbuf; /* receive buffer (SD PDUs) */
+ int last_end_src; /* source field from last xmitted end pdu */
+ int clear_buffers; /* flag */
+ int credit; /* send window not closed */
+ u_int ll_busy; /* lower layer busy */
+ u_int rs_mr; /* N(MR) in last RS PDU */
+ u_int rs_sq; /* N(SQ) in last RS PDU */
+ struct SSCOP_MBUF_T *uu_bgn; /* last UU data */
+ struct SSCOP_MBUF_T *uu_bgak; /* ... */
+ struct SSCOP_MBUF_T *uu_bgrej; /* ... */
+ struct SSCOP_MBUF_T *uu_end; /* ... */
+ struct SSCOP_MBUF_T *uu_rs; /* ... */
+
+ /* signal queues */
+ sscop_sigq_head_t sigs; /* saved signals */
+ sscop_sigq_head_t saved_sigs; /* saved signals */
+ int in_sig; /* in signal handler */
+
+ /* debugging */
+ u_int debug;
+
+ /* AA interface */
+ void *aarg;
+};
+
+
+/*
+ * Default values for SSCOP
+ */
+enum {
+ MAXK = 4096,
+ MAXMAXK = 65528,
+ MAXJ = 4096,
+ MAXMAXJ = 65524,
+ MAXCC = 4,
+ MAXSTAT = 67,
+ MAXPD = 25,
+ MAXMR = 128, /* ??? */
+ TIMERCC = 1000,
+ TIMERKA = 2000,
+ TIMERNR = 7000,
+ TIMERPOLL = 750,
+ TIMERIDLE = 15000,
+};
+
+/*
+ * Sequence number arithmetic
+ */
+#define SEQNO_DIFF(A,B) (((A) < (B)) ? ((A) + (1<<24) - (B)) : ((A) - (B)))
+
+/*
+ * Debugging
+ */
+#ifdef SSCOP_DEBUG
+#define VERBOSE(S,M,F) if ((S)->debug & (M)) (S)->funcs->verbose F
+#define VERBERR(S,M,F) if ((S)->debug & (M)) (S)->funcs->verbose F
+#define ISVERBOSE(S,M) ((S)->debug & (M))
+#else
+#define VERBOSE(S,M,F)
+#define VERBERR(S,M,F)
+#define ISVERBOSE(S,M) (0)
+#endif
OpenPOWER on IntegriCloud