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