1169978Skmacy/**************************************************************************
2169978Skmacy
3183062SkmacyCopyright (c) 2007-2008, Chelsio Inc.
4169978SkmacyAll rights reserved.
5169978Skmacy
6169978SkmacyRedistribution and use in source and binary forms, with or without
7169978Skmacymodification, are permitted provided that the following conditions are met:
8169978Skmacy
9169978Skmacy 1. Redistributions of source code must retain the above copyright notice,
10169978Skmacy    this list of conditions and the following disclaimer.
11169978Skmacy
12169978Skmacy 2. Neither the name of the Chelsio Corporation nor the names of its
13169978Skmacy    contributors may be used to endorse or promote products derived from
14169978Skmacy    this software without specific prior written permission.
15169978Skmacy
16169978SkmacyTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17169978SkmacyAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18169978SkmacyIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19169978SkmacyARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20169978SkmacyLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21169978SkmacyCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22169978SkmacySUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23169978SkmacyINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24169978SkmacyCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25169978SkmacyARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26169978SkmacyPOSSIBILITY OF SUCH DAMAGE.
27169978Skmacy
28169978Skmacy$FreeBSD$
29169978Skmacy
30169978Skmacy***************************************************************************/
31169978Skmacy
32170076Skmacy#ifndef CXGB_MBUFQ_H_
33170076Skmacy#define CXGB_MBUFQ_H_
34170076Skmacy
35169978Skmacystruct mbuf_head {
36169978Skmacy	struct mbuf *head;
37169978Skmacy	struct mbuf *tail;
38169978Skmacy	uint32_t     qlen;
39174640Skmacy	uint32_t     qsize;
40169978Skmacy	struct mtx   lock;
41169978Skmacy};
42169978Skmacy
43169978Skmacystatic __inline void
44169978Skmacymbufq_init(struct mbuf_head *l)
45169978Skmacy{
46169978Skmacy	l->head = l->tail = NULL;
47174640Skmacy	l->qlen = l->qsize = 0;
48169978Skmacy}
49169978Skmacy
50169978Skmacystatic __inline int
51169978Skmacymbufq_empty(struct mbuf_head *l)
52169978Skmacy{
53169978Skmacy	return (l->head == NULL);
54169978Skmacy}
55169978Skmacy
56169978Skmacystatic __inline int
57169978Skmacymbufq_len(struct mbuf_head *l)
58169978Skmacy{
59169978Skmacy	return (l->qlen);
60169978Skmacy}
61169978Skmacy
62174640Skmacystatic __inline int
63174640Skmacymbufq_size(struct mbuf_head *l)
64174640Skmacy{
65174640Skmacy	return (l->qsize);
66174640Skmacy}
67169978Skmacy
68174640Skmacystatic __inline int
69174640Skmacymbufq_head_size(struct mbuf_head *l)
70174640Skmacy{
71174640Skmacy	return (l->head ? l->head->m_pkthdr.len : 0);
72174640Skmacy}
73174640Skmacy
74169978Skmacystatic __inline void
75169978Skmacymbufq_tail(struct mbuf_head *l, struct mbuf *m)
76169978Skmacy{
77169978Skmacy	l->qlen++;
78174640Skmacy	if (l->head == NULL)
79174640Skmacy		l->head = m;
80174640Skmacy	else
81174640Skmacy		l->tail->m_nextpkt = m;
82169978Skmacy	l->tail = m;
83174640Skmacy	l->qsize += m->m_pkthdr.len;
84169978Skmacy}
85169978Skmacy
86169978Skmacystatic __inline struct mbuf *
87169978Skmacymbufq_dequeue(struct mbuf_head *l)
88169978Skmacy{
89169978Skmacy	struct mbuf *m;
90169978Skmacy
91169978Skmacy	m = l->head;
92169978Skmacy	if (m) {
93169978Skmacy		if (m == l->tail)
94174640Skmacy			l->head = l->tail = NULL;
95174640Skmacy		else
96174640Skmacy			l->head = m->m_nextpkt;
97174640Skmacy		m->m_nextpkt = NULL;
98169978Skmacy		l->qlen--;
99174640Skmacy		l->qsize -= m->m_pkthdr.len;
100169978Skmacy	}
101169978Skmacy
102169978Skmacy	return (m);
103169978Skmacy}
104169978Skmacy
105169978Skmacystatic __inline struct mbuf *
106176472Skmacymbufq_peek(const struct mbuf_head *l)
107169978Skmacy{
108169978Skmacy	return (l->head);
109169978Skmacy}
110170076Skmacy
111174640Skmacystatic __inline void
112174640Skmacymbufq_append(struct mbuf_head *a, struct mbuf_head *b)
113174640Skmacy{
114174640Skmacy	if (a->tail)
115174640Skmacy		a->tail->m_nextpkt = b->head;
116174640Skmacy	if (b->tail)
117174640Skmacy		a->tail = b->tail;
118174640Skmacy	a->qlen += b->qlen;
119174640Skmacy	a->qsize += b->qsize;
120174640Skmacy
121174640Skmacy
122174640Skmacy}
123170076Skmacy#endif  /* CXGB_MBUFQ_H_ */
124