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