1*d0d2e523SLutz Donnerhacke /*- 2*d0d2e523SLutz Donnerhacke * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3*d0d2e523SLutz Donnerhacke * 4*d0d2e523SLutz Donnerhacke * Copyright (c) 2019 Lutz Donnerhacke <lutz@donnerhacke.de> 5*d0d2e523SLutz Donnerhacke * 6*d0d2e523SLutz Donnerhacke * Redistribution and use in source and binary forms, with or without 7*d0d2e523SLutz Donnerhacke * modification, are permitted provided that the following conditions 8*d0d2e523SLutz Donnerhacke * are met: 9*d0d2e523SLutz Donnerhacke * 1. Redistributions of source code must retain the above copyright 10*d0d2e523SLutz Donnerhacke * notice, this list of conditions and the following disclaimer. 11*d0d2e523SLutz Donnerhacke * 2. Redistributions in binary form must reproduce the above copyright 12*d0d2e523SLutz Donnerhacke * notice, this list of conditions and the following disclaimer in the 13*d0d2e523SLutz Donnerhacke * documentation and/or other materials provided with the distribution. 14*d0d2e523SLutz Donnerhacke * 15*d0d2e523SLutz Donnerhacke * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16*d0d2e523SLutz Donnerhacke * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17*d0d2e523SLutz Donnerhacke * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18*d0d2e523SLutz Donnerhacke * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE 19*d0d2e523SLutz Donnerhacke * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20*d0d2e523SLutz Donnerhacke * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21*d0d2e523SLutz Donnerhacke * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22*d0d2e523SLutz Donnerhacke * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23*d0d2e523SLutz Donnerhacke * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24*d0d2e523SLutz Donnerhacke * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25*d0d2e523SLutz Donnerhacke * SUCH DAMAGE. 26*d0d2e523SLutz Donnerhacke * 27*d0d2e523SLutz Donnerhacke * $FreeBSD$ 28*d0d2e523SLutz Donnerhacke */ 29*d0d2e523SLutz Donnerhacke 30*d0d2e523SLutz Donnerhacke #ifndef _NETGRAPH_QOS_H_ 31*d0d2e523SLutz Donnerhacke #define _NETGRAPH_QOS_H_ 32*d0d2e523SLutz Donnerhacke 33*d0d2e523SLutz Donnerhacke #include <sys/mbuf.h> 34*d0d2e523SLutz Donnerhacke 35*d0d2e523SLutz Donnerhacke /* ABI cookie */ 36*d0d2e523SLutz Donnerhacke #define M_QOS_COOKIE 1571268051 37*d0d2e523SLutz Donnerhacke #define MTAG_SIZE(X) ( sizeof(struct X) - sizeof(struct m_tag) ) 38*d0d2e523SLutz Donnerhacke 39*d0d2e523SLutz Donnerhacke /* 40*d0d2e523SLutz Donnerhacke * Definition of types within this ABI: 41*d0d2e523SLutz Donnerhacke * - Choose a type (16bit) by i.e. "echo $((1000+$(date +%s)%64536))" 42*d0d2e523SLutz Donnerhacke * - Retry if the type is already in use 43*d0d2e523SLutz Donnerhacke * - Define the structure for the type according to mbuf_tags(9) 44*d0d2e523SLutz Donnerhacke * struct m_qos_foo { 45*d0d2e523SLutz Donnerhacke * struct m_tag tag; 46*d0d2e523SLutz Donnerhacke * ... 47*d0d2e523SLutz Donnerhacke * }; 48*d0d2e523SLutz Donnerhacke * Preferred usage: 49*d0d2e523SLutz Donnerhacke * struct m_qos_foo *p = (void *)m_tag_locate(m, 50*d0d2e523SLutz Donnerhacke * M_QOS_COOKIE, M_QOS_FOO, ...); 51*d0d2e523SLutz Donnerhacke * or 52*d0d2e523SLutz Donnerhacke * p = (void *)m_tag_alloc( 53*d0d2e523SLutz Donnerhacke * M_QOS_COOKIE, M_QOS_FOO, MTAG_SIZE(foo), ...); 54*d0d2e523SLutz Donnerhacke m_tag_prepend(m, &p->tag); 55*d0d2e523SLutz Donnerhacke */ 56*d0d2e523SLutz Donnerhacke 57*d0d2e523SLutz Donnerhacke /* Color marking type */ 58*d0d2e523SLutz Donnerhacke #define M_QOS_COLOR 23568 59*d0d2e523SLutz Donnerhacke /* Keep colors ordered semantically in order to allow use of "<=" or ">=" */ 60*d0d2e523SLutz Donnerhacke enum qos_color { 61*d0d2e523SLutz Donnerhacke QOS_COLOR_GREEN, 62*d0d2e523SLutz Donnerhacke QOS_COLOR_YELLOW, 63*d0d2e523SLutz Donnerhacke QOS_COLOR_RED 64*d0d2e523SLutz Donnerhacke }; 65*d0d2e523SLutz Donnerhacke struct m_qos_color { 66*d0d2e523SLutz Donnerhacke struct m_tag tag; 67*d0d2e523SLutz Donnerhacke enum qos_color color; 68*d0d2e523SLutz Donnerhacke }; 69*d0d2e523SLutz Donnerhacke 70*d0d2e523SLutz Donnerhacke /* 71*d0d2e523SLutz Donnerhacke * Priority class 72*d0d2e523SLutz Donnerhacke * 73*d0d2e523SLutz Donnerhacke * Processing per priority requires an overhead, which should 74*d0d2e523SLutz Donnerhacke * be static (i.e. for alloctating queues) and small (for memory) 75*d0d2e523SLutz Donnerhacke * So keep your chosen range limited. 76*d0d2e523SLutz Donnerhacke */ 77*d0d2e523SLutz Donnerhacke #define M_QOS_PRIORITY 28858 78*d0d2e523SLutz Donnerhacke struct m_qos_priority { 79*d0d2e523SLutz Donnerhacke struct m_tag tag; 80*d0d2e523SLutz Donnerhacke uint8_t priority; /* 0 - lowest */ 81*d0d2e523SLutz Donnerhacke }; 82*d0d2e523SLutz Donnerhacke 83*d0d2e523SLutz Donnerhacke #endif /* _NETGRAPH_QOS_H_ */ 84