1*718cf2ccSPedro F. Giffuni /*- 2*718cf2ccSPedro F. Giffuni * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3*718cf2ccSPedro F. Giffuni * 437e3a6d3SLuigi Rizzo * Copyright (C) 2013-2014 Vincenzo Maffione 537e3a6d3SLuigi Rizzo * All rights reserved. 6f9790aebSLuigi Rizzo * 7f9790aebSLuigi Rizzo * Redistribution and use in source and binary forms, with or without 8f9790aebSLuigi Rizzo * modification, are permitted provided that the following conditions 9f9790aebSLuigi Rizzo * are met: 10f9790aebSLuigi Rizzo * 1. Redistributions of source code must retain the above copyright 11f9790aebSLuigi Rizzo * notice, this list of conditions and the following disclaimer. 12f9790aebSLuigi Rizzo * 2. Redistributions in binary form must reproduce the above copyright 13f9790aebSLuigi Rizzo * notice, this list of conditions and the following disclaimer in the 14f9790aebSLuigi Rizzo * documentation and/or other materials provided with the distribution. 15f9790aebSLuigi Rizzo * 16f9790aebSLuigi Rizzo * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17f9790aebSLuigi Rizzo * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18f9790aebSLuigi Rizzo * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19f9790aebSLuigi Rizzo * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20f9790aebSLuigi Rizzo * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21f9790aebSLuigi Rizzo * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22f9790aebSLuigi Rizzo * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23f9790aebSLuigi Rizzo * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24f9790aebSLuigi Rizzo * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25f9790aebSLuigi Rizzo * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26f9790aebSLuigi Rizzo * SUCH DAMAGE. 27f9790aebSLuigi Rizzo */ 28f9790aebSLuigi Rizzo 29f9790aebSLuigi Rizzo /* 30f9790aebSLuigi Rizzo * $FreeBSD$ 31f9790aebSLuigi Rizzo */ 32f9790aebSLuigi Rizzo 33f9790aebSLuigi Rizzo 34c3e9b4dbSLuiz Otavio O Souza #ifndef _NET_NETMAP_MBQ_H__ 35c3e9b4dbSLuiz Otavio O Souza #define _NET_NETMAP_MBQ_H__ 36f9790aebSLuigi Rizzo 37f9790aebSLuigi Rizzo /* 38f9790aebSLuigi Rizzo * These function implement an mbuf tailq with an optional lock. 39f9790aebSLuigi Rizzo * The base functions act ONLY ON THE QUEUE, whereas the "safe" 40f9790aebSLuigi Rizzo * variants (mbq_safe_*) also handle the lock. 41f9790aebSLuigi Rizzo */ 42f9790aebSLuigi Rizzo 43f9790aebSLuigi Rizzo /* XXX probably rely on a previous definition of SPINLOCK_T */ 44f9790aebSLuigi Rizzo #ifdef linux 45f9790aebSLuigi Rizzo #define SPINLOCK_T safe_spinlock_t 4637e3a6d3SLuigi Rizzo #elif defined (_WIN32) 4737e3a6d3SLuigi Rizzo #define SPINLOCK_T win_spinlock_t 48f9790aebSLuigi Rizzo #else 49f9790aebSLuigi Rizzo #define SPINLOCK_T struct mtx 50f9790aebSLuigi Rizzo #endif 51f9790aebSLuigi Rizzo 52f9790aebSLuigi Rizzo /* A FIFO queue of mbufs with an optional lock. */ 53f9790aebSLuigi Rizzo struct mbq { 54f9790aebSLuigi Rizzo struct mbuf *head; 55f9790aebSLuigi Rizzo struct mbuf *tail; 56f9790aebSLuigi Rizzo int count; 57f9790aebSLuigi Rizzo SPINLOCK_T lock; 58f9790aebSLuigi Rizzo }; 59f9790aebSLuigi Rizzo 6037e3a6d3SLuigi Rizzo /* We should clarify whether init can be used while 61f9790aebSLuigi Rizzo * holding a lock, and whether mbq_safe_destroy() is a NOP. 62f9790aebSLuigi Rizzo */ 63f9790aebSLuigi Rizzo void mbq_init(struct mbq *q); 6437e3a6d3SLuigi Rizzo void mbq_fini(struct mbq *q); 65f9790aebSLuigi Rizzo void mbq_enqueue(struct mbq *q, struct mbuf *m); 66f9790aebSLuigi Rizzo struct mbuf *mbq_dequeue(struct mbq *q); 67f9790aebSLuigi Rizzo void mbq_purge(struct mbq *q); 68f9790aebSLuigi Rizzo 6937e3a6d3SLuigi Rizzo static inline struct mbuf * 7037e3a6d3SLuigi Rizzo mbq_peek(struct mbq *q) 7137e3a6d3SLuigi Rizzo { 72c3e9b4dbSLuiz Otavio O Souza return q->head; 7337e3a6d3SLuigi Rizzo } 7437e3a6d3SLuigi Rizzo 75997b054cSLuigi Rizzo static inline void 76997b054cSLuigi Rizzo mbq_lock(struct mbq *q) 77997b054cSLuigi Rizzo { 78997b054cSLuigi Rizzo mtx_lock_spin(&q->lock); 79997b054cSLuigi Rizzo } 80997b054cSLuigi Rizzo 81997b054cSLuigi Rizzo static inline void 82997b054cSLuigi Rizzo mbq_unlock(struct mbq *q) 83997b054cSLuigi Rizzo { 84997b054cSLuigi Rizzo mtx_unlock_spin(&q->lock); 85997b054cSLuigi Rizzo } 86f9790aebSLuigi Rizzo 874bf50f18SLuigi Rizzo 88f9790aebSLuigi Rizzo void mbq_safe_init(struct mbq *q); 8937e3a6d3SLuigi Rizzo void mbq_safe_fini(struct mbq *q); 90f9790aebSLuigi Rizzo void mbq_safe_enqueue(struct mbq *q, struct mbuf *m); 91f9790aebSLuigi Rizzo struct mbuf *mbq_safe_dequeue(struct mbq *q); 92f9790aebSLuigi Rizzo void mbq_safe_purge(struct mbq *q); 93f9790aebSLuigi Rizzo 94f9790aebSLuigi Rizzo static inline unsigned int mbq_len(struct mbq *q) 95f9790aebSLuigi Rizzo { 96f9790aebSLuigi Rizzo return q->count; 97f9790aebSLuigi Rizzo } 98f9790aebSLuigi Rizzo 99c3e9b4dbSLuiz Otavio O Souza #endif /* _NET_NETMAP_MBQ_H_ */ 100