summaryrefslogtreecommitdiffstats
path: root/sys/netatm/queue.h
diff options
context:
space:
mode:
Diffstat (limited to 'sys/netatm/queue.h')
-rw-r--r--sys/netatm/queue.h213
1 files changed, 213 insertions, 0 deletions
diff --git a/sys/netatm/queue.h b/sys/netatm/queue.h
new file mode 100644
index 0000000..8a8febf
--- /dev/null
+++ b/sys/netatm/queue.h
@@ -0,0 +1,213 @@
+/*
+ *
+ * ===================================
+ * HARP | Host ATM Research Platform
+ * ===================================
+ *
+ *
+ * This Host ATM Research Platform ("HARP") file (the "Software") is
+ * made available by Network Computing Services, Inc. ("NetworkCS")
+ * "AS IS". NetworkCS does not provide maintenance, improvements or
+ * support of any kind.
+ *
+ * NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED,
+ * INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE
+ * SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE.
+ * In no event shall NetworkCS be responsible for any damages, including
+ * but not limited to consequential damages, arising from or relating to
+ * any use of the Software or related support.
+ *
+ * Copyright 1994-1998 Network Computing Services, Inc.
+ *
+ * Copies of this Software may be made, however, the above copyright
+ * notice must be reproduced on all copies.
+ *
+ * @(#) $Id: queue.h,v 1.2 1997/05/06 22:14:38 mks Exp $
+ *
+ */
+
+/*
+ * Core ATM Services
+ * -----------------
+ *
+ * General queueing/linking definitions
+ *
+ */
+
+#ifndef _NETATM_QUEUE_H
+#define _NETATM_QUEUE_H
+
+/*
+ * Structure defining the queue controls for a doubly linked queue
+ */
+struct q_queue {
+ caddr_t q_head; /* Head of queue */
+ caddr_t q_tail; /* Tail of queue */
+};
+typedef struct q_queue Queue_t;
+
+/*
+ * Structure defining the queue elements of a doubly linked queue
+ */
+struct q_elem {
+ caddr_t q_forw; /* Forward link */
+ caddr_t q_back; /* Backward link */
+};
+typedef struct q_elem Qelem_t;
+
+/*
+ * Macro to add a control block onto the tail of a doubly linked queue
+ * e = control block to add
+ * t = control block structure type
+ * el = name of control block's q_elem field
+ * q = pointer to queue controls
+ */
+#define ENQUEUE(e,t,el,q) \
+{ \
+ (e)->el.q_forw = NULL; \
+ (e)->el.q_back = (q).q_tail; \
+ if ((q).q_head == NULL) { \
+ (q).q_head = (caddr_t)(e); \
+ (q).q_tail = (caddr_t)(e); \
+ } else { \
+ ((t *)(q).q_tail)->el.q_forw = (caddr_t)(e); \
+ (q).q_tail = (caddr_t)(e); \
+ } \
+}
+
+/*
+ * Macro to remove a control block from a doubly linked queue
+ * e = control block to remove
+ * t = control block structure type
+ * el = name of control block's q_elem field
+ * q = pointer to queue controls
+ */
+#define DEQUEUE(e,t,el,q) \
+{ \
+ /* Ensure control block is on queue */ \
+ if ((e)->el.q_forw || (q).q_tail == (caddr_t)(e)) { \
+ if ((e)->el.q_forw) \
+ ((t *)(e)->el.q_forw)->el.q_back = (e)->el.q_back;\
+ else \
+ (q).q_tail = (e)->el.q_back; \
+ if ((e)->el.q_back) \
+ ((t *)(e)->el.q_back)->el.q_forw = (e)->el.q_forw;\
+ else \
+ (q).q_head = (e)->el.q_forw; \
+ } \
+ (e)->el.q_back = (e)->el.q_forw = NULL; \
+}
+
+/*
+ * Macro to return the head of a doubly linked queue
+ * q = pointer to queue controls
+ * t = control block structure type
+ */
+#define Q_HEAD(q,t) ((t *)(q).q_head)
+
+/*
+ * Macro to return the next control block of a doubly linked queue
+ * e = current control block
+ * t = control block structure type
+ * el = name of control block's q_elem field
+ */
+#define Q_NEXT(e,t,el) ((t *)(e)->el.q_forw)
+
+
+/*
+ * Macro to add a control block onto the head of a singly linked chain
+ * u = control block to add
+ * t = structure type
+ * h = head of chain
+ * l = name of link field
+ */
+#define LINK2HEAD(u,t,h,l) \
+{ \
+ (u)->l = (h); \
+ (h) = (u); \
+}
+
+/*
+ * Macro to add a control block onto the tail of a singly linked chain
+ * u = control block to add
+ * t = structure type
+ * h = head of chain
+ * l = name of link field
+ */
+#define LINK2TAIL(u,t,h,l) \
+{ \
+ (u)->l = (t *)NULL; \
+ /* Check for empty chain */ \
+ if ((h) == (t *)NULL) { \
+ (h) = (u); \
+ } else { \
+ t *tp; \
+ /* Loop until we find the end of chain */ \
+ for (tp = (h); tp->l != (t *)NULL; tp = tp->l) \
+ ; \
+ tp->l = (u); \
+ } \
+}
+
+/*
+ * Macro to remove a control block from a singly linked chain
+ * u = control block to unlink
+ * t = structure type
+ * h = head of chain
+ * l = name of link field
+ */
+#define UNLINK(u,t,h,l) \
+{ \
+ /* Check for control block at head of chain */ \
+ if ((u) == (h)) { \
+ (h) = (u)->l; \
+ } else { \
+ t *tp; \
+ /* Loop until we find the control block */ \
+ for (tp = (h); tp != (t *)NULL; tp = tp->l) { \
+ if (tp->l == (u)) \
+ break; \
+ } \
+ if (tp) { \
+ /* Remove it from chain */ \
+ tp->l = (u)->l; \
+ } \
+ } \
+ (u)->l = (t *)NULL; \
+}
+
+/*
+ * Macro to remove a control block from a singly linked chain and return
+ * an indication of whether the block was found
+ * u = control block to unlink
+ * t = structure type
+ * h = head of chain
+ * l = name of link field
+ * f = flag; 1 => control block found on chain; else 0
+ */
+#define UNLINKF(u,t,h,l,f) \
+{ \
+ /* Check for control block at head of chain */ \
+ if ((u) == (h)) { \
+ (h) = (u)->l; \
+ (f) = 1; \
+ } else { \
+ t *tp; \
+ /* Loop until we find the control block */ \
+ for (tp = (h); tp != (t *)NULL; tp = tp->l) { \
+ if (tp->l == (u)) \
+ break; \
+ } \
+ if (tp) { \
+ /* Remove it from chain */ \
+ tp->l = (u)->l; \
+ (f) = 1; \
+ } else \
+ /* It wasn't on the chain */ \
+ (f) = 0; \
+ } \
+ (u)->l = (t *)NULL; \
+}
+
+#endif /* _NETATM_QUEUE_H */
OpenPOWER on IntegriCloud