1181643Skmacy/**************************************************************************
2181643Skmacy
3181643SkmacyCopyright (c) 2007, Chelsio Inc.
4181643SkmacyAll rights reserved.
5181643Skmacy
6181643SkmacyRedistribution and use in source and binary forms, with or without
7181643Skmacymodification, are permitted provided that the following conditions are met:
8181643Skmacy
9181643Skmacy 1. Redistributions of source code must retain the above copyright notice,
10181643Skmacy    this list of conditions and the following disclaimer.
11181643Skmacy
12181643Skmacy 2. Neither the name of the Chelsio Corporation nor the names of its
13181643Skmacy    contributors may be used to endorse or promote products derived from
14181643Skmacy    this software without specific prior written permission.
15181643Skmacy
16181643SkmacyTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17181643SkmacyAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18181643SkmacyIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19181643SkmacyARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20181643SkmacyLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21181643SkmacyCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22181643SkmacySUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23181643SkmacyINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24181643SkmacyCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25181643SkmacyARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26181643SkmacyPOSSIBILITY OF SUCH DAMAGE.
27181643Skmacy
28181643Skmacy$FreeBSD$
29181643Skmacy
30181643Skmacy***************************************************************************/
31181643Skmacy
32181643Skmacy#ifndef CXGB_MBUFQ_H_
33181643Skmacy#define CXGB_MBUFQ_H_
34181643Skmacy
35181643Skmacystruct mbuf_head {
36181643Skmacy	struct mbuf *head;
37181643Skmacy	struct mbuf *tail;
38181643Skmacy	uint32_t     qlen;
39181643Skmacy	uint32_t     qsize;
40181643Skmacy	struct mtx   lock;
41181643Skmacy};
42181643Skmacy
43181643Skmacystatic __inline void
44181643Skmacymbufq_init(struct mbuf_head *l)
45181643Skmacy{
46181643Skmacy	l->head = l->tail = NULL;
47181643Skmacy	l->qlen = l->qsize = 0;
48181643Skmacy}
49181643Skmacy
50181643Skmacystatic __inline int
51181643Skmacymbufq_empty(struct mbuf_head *l)
52181643Skmacy{
53181643Skmacy	return (l->head == NULL);
54181643Skmacy}
55181643Skmacy
56181643Skmacystatic __inline int
57181643Skmacymbufq_len(struct mbuf_head *l)
58181643Skmacy{
59181643Skmacy	return (l->qlen);
60181643Skmacy}
61181643Skmacy
62181643Skmacystatic __inline int
63181643Skmacymbufq_size(struct mbuf_head *l)
64181643Skmacy{
65181643Skmacy	return (l->qsize);
66181643Skmacy}
67181643Skmacy
68181643Skmacystatic __inline int
69181643Skmacymbufq_head_size(struct mbuf_head *l)
70181643Skmacy{
71181643Skmacy	return (l->head ? l->head->m_pkthdr.len : 0);
72181643Skmacy}
73181643Skmacy
74181643Skmacystatic __inline void
75181643Skmacymbufq_tail(struct mbuf_head *l, struct mbuf *m)
76181643Skmacy{
77181643Skmacy	l->qlen++;
78181643Skmacy	if (l->head == NULL)
79181643Skmacy		l->head = m;
80181643Skmacy	else
81181643Skmacy		l->tail->m_nextpkt = m;
82181643Skmacy	l->tail = m;
83181643Skmacy	l->qsize += m->m_pkthdr.len;
84181643Skmacy}
85181643Skmacy
86181643Skmacystatic __inline struct mbuf *
87181643Skmacymbufq_dequeue(struct mbuf_head *l)
88181643Skmacy{
89181643Skmacy	struct mbuf *m;
90181643Skmacy
91181643Skmacy	m = l->head;
92181643Skmacy	if (m) {
93181643Skmacy		if (m == l->tail)
94181643Skmacy			l->head = l->tail = NULL;
95181643Skmacy		else
96181643Skmacy			l->head = m->m_nextpkt;
97181643Skmacy		m->m_nextpkt = NULL;
98181643Skmacy		l->qlen--;
99181643Skmacy		l->qsize -= m->m_pkthdr.len;
100181643Skmacy	}
101181643Skmacy
102181643Skmacy	return (m);
103181643Skmacy}
104181643Skmacy
105181643Skmacystatic __inline struct mbuf *
106181643Skmacymbufq_peek(struct mbuf_head *l)
107181643Skmacy{
108181643Skmacy	return (l->head);
109181643Skmacy}
110181643Skmacy
111181643Skmacystatic __inline void
112181643Skmacymbufq_append(struct mbuf_head *a, struct mbuf_head *b)
113181643Skmacy{
114181643Skmacy	if (a->tail)
115181643Skmacy		a->tail->m_nextpkt = b->head;
116181643Skmacy	if (b->tail)
117181643Skmacy		a->tail = b->tail;
118181643Skmacy	a->qlen += b->qlen;
119181643Skmacy	a->qsize += b->qsize;
120181643Skmacy
121181643Skmacy
122181643Skmacy}
123181643Skmacy#endif  /* CXGB_MBUFQ_H_ */
124