1*a325d9c4SApple OSS Distributions /* 2*a325d9c4SApple OSS Distributions * Copyright (c) 2016-2021 Apple Inc. All rights reserved. 3*a325d9c4SApple OSS Distributions * 4*a325d9c4SApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5*a325d9c4SApple OSS Distributions * 6*a325d9c4SApple OSS Distributions * This file contains Original Code and/or Modifications of Original Code 7*a325d9c4SApple OSS Distributions * as defined in and that are subject to the Apple Public Source License 8*a325d9c4SApple OSS Distributions * Version 2.0 (the 'License'). You may not use this file except in 9*a325d9c4SApple OSS Distributions * compliance with the License. The rights granted to you under the License 10*a325d9c4SApple OSS Distributions * may not be used to create, or enable the creation or redistribution of, 11*a325d9c4SApple OSS Distributions * unlawful or unlicensed copies of an Apple operating system, or to 12*a325d9c4SApple OSS Distributions * circumvent, violate, or enable the circumvention or violation of, any 13*a325d9c4SApple OSS Distributions * terms of an Apple operating system software license agreement. 14*a325d9c4SApple OSS Distributions * 15*a325d9c4SApple OSS Distributions * Please obtain a copy of the License at 16*a325d9c4SApple OSS Distributions * http://www.opensource.apple.com/apsl/ and read it before using this file. 17*a325d9c4SApple OSS Distributions * 18*a325d9c4SApple OSS Distributions * The Original Code and all software distributed under the License are 19*a325d9c4SApple OSS Distributions * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20*a325d9c4SApple OSS Distributions * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21*a325d9c4SApple OSS Distributions * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22*a325d9c4SApple OSS Distributions * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23*a325d9c4SApple OSS Distributions * Please see the License for the specific language governing rights and 24*a325d9c4SApple OSS Distributions * limitations under the License. 25*a325d9c4SApple OSS Distributions * 26*a325d9c4SApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27*a325d9c4SApple OSS Distributions */ 28*a325d9c4SApple OSS Distributions 29*a325d9c4SApple OSS Distributions #ifndef _NET_CLASSQ_CLASSQ_FQ_CODEL_H 30*a325d9c4SApple OSS Distributions #define _NET_CLASSQ_CLASSQ_FQ_CODEL_H 31*a325d9c4SApple OSS Distributions #ifdef PRIVATE 32*a325d9c4SApple OSS Distributions #ifdef BSD_KERNEL_PRIVATE 33*a325d9c4SApple OSS Distributions #include <stdbool.h> 34*a325d9c4SApple OSS Distributions #include <sys/time.h> 35*a325d9c4SApple OSS Distributions #include <net/flowadv.h> 36*a325d9c4SApple OSS Distributions #include <net/classq/if_classq.h> 37*a325d9c4SApple OSS Distributions #if SKYWALK 38*a325d9c4SApple OSS Distributions #include <skywalk/os_skywalk_private.h> 39*a325d9c4SApple OSS Distributions #endif /* SKYWALK */ 40*a325d9c4SApple OSS Distributions 41*a325d9c4SApple OSS Distributions #ifdef __cplusplus 42*a325d9c4SApple OSS Distributions extern "C" { 43*a325d9c4SApple OSS Distributions #endif 44*a325d9c4SApple OSS Distributions 45*a325d9c4SApple OSS Distributions #define FQ_MIN_FC_THRESHOLD_BYTES 7500 46*a325d9c4SApple OSS Distributions #define FQ_IS_DELAYHIGH(_fq_) ((_fq_)->fq_flags & FQF_DELAY_HIGH) 47*a325d9c4SApple OSS Distributions #define FQ_SET_DELAY_HIGH(_fq_) do { \ 48*a325d9c4SApple OSS Distributions (_fq_)->fq_flags |= FQF_DELAY_HIGH; \ 49*a325d9c4SApple OSS Distributions } while (0) 50*a325d9c4SApple OSS Distributions #define FQ_CLEAR_DELAY_HIGH(_fq_) do { \ 51*a325d9c4SApple OSS Distributions (_fq_)->fq_flags &= ~FQF_DELAY_HIGH; \ 52*a325d9c4SApple OSS Distributions } while (0) 53*a325d9c4SApple OSS Distributions 54*a325d9c4SApple OSS Distributions typedef struct flowq { 55*a325d9c4SApple OSS Distributions union { 56*a325d9c4SApple OSS Distributions MBUFQ_HEAD(mbufq_head) __mbufq; /* mbuf packet queue */ 57*a325d9c4SApple OSS Distributions #if SKYWALK 58*a325d9c4SApple OSS Distributions KPKTQ_HEAD(kpktq_head) __kpktq; /* skywalk packet queue */ 59*a325d9c4SApple OSS Distributions #endif /* SKYWALK */ 60*a325d9c4SApple OSS Distributions } __fq_pktq_u; 61*a325d9c4SApple OSS Distributions #define FQF_FLOWCTL_CAPABLE 0x01 /* Use flow control instead of drop */ 62*a325d9c4SApple OSS Distributions #define FQF_DELAY_HIGH 0x02 /* Min delay is greater than target */ 63*a325d9c4SApple OSS Distributions #define FQF_NEW_FLOW 0x04 /* Currently on new flows queue */ 64*a325d9c4SApple OSS Distributions #define FQF_OLD_FLOW 0x08 /* Currently on old flows queue */ 65*a325d9c4SApple OSS Distributions #define FQF_FLOWCTL_ON 0x10 /* Currently flow controlled */ 66*a325d9c4SApple OSS Distributions #define FQF_DESTROYED 0x80 /* flowq destroyed */ 67*a325d9c4SApple OSS Distributions uint8_t fq_flags; /* flags */ 68*a325d9c4SApple OSS Distributions uint8_t fq_sc_index; /* service_class index */ 69*a325d9c4SApple OSS Distributions int32_t fq_deficit; /* Deficit for scheduling */ 70*a325d9c4SApple OSS Distributions uint32_t fq_bytes; /* Number of bytes in the queue */ 71*a325d9c4SApple OSS Distributions uint64_t fq_min_qdelay; /* min queue delay for Codel */ 72*a325d9c4SApple OSS Distributions uint64_t fq_updatetime; /* next update interval */ 73*a325d9c4SApple OSS Distributions uint64_t fq_getqtime; /* last dequeue time */ 74*a325d9c4SApple OSS Distributions SLIST_ENTRY(flowq) fq_hashlink; /* for flow queue hash table */ 75*a325d9c4SApple OSS Distributions STAILQ_ENTRY(flowq) fq_actlink; /* for new/old flow queues */ 76*a325d9c4SApple OSS Distributions uint32_t fq_flowhash; /* Flow hash */ 77*a325d9c4SApple OSS Distributions classq_pkt_type_t fq_ptype; /* Packet type */ 78*a325d9c4SApple OSS Distributions /* temporary packet queue for dequeued packets */ 79*a325d9c4SApple OSS Distributions classq_pkt_t fq_dq_head; 80*a325d9c4SApple OSS Distributions classq_pkt_t fq_dq_tail; 81*a325d9c4SApple OSS Distributions STAILQ_ENTRY(flowq) fq_dqlink; /* entry on dequeue flow list */ 82*a325d9c4SApple OSS Distributions bool fq_in_dqlist; 83*a325d9c4SApple OSS Distributions } fq_t; 84*a325d9c4SApple OSS Distributions 85*a325d9c4SApple OSS Distributions #define fq_mbufq __fq_pktq_u.__mbufq 86*a325d9c4SApple OSS Distributions #if SKYWALK 87*a325d9c4SApple OSS Distributions #define fq_kpktq __fq_pktq_u.__kpktq 88*a325d9c4SApple OSS Distributions #endif /* SKYWALK */ 89*a325d9c4SApple OSS Distributions 90*a325d9c4SApple OSS Distributions #if SKYWALK 91*a325d9c4SApple OSS Distributions #define fq_empty(_q) (((_q)->fq_ptype == QP_MBUF) ? \ 92*a325d9c4SApple OSS Distributions MBUFQ_EMPTY(&(_q)->fq_mbufq) : \ 93*a325d9c4SApple OSS Distributions KPKTQ_EMPTY(&(_q)->fq_kpktq)) 94*a325d9c4SApple OSS Distributions #else /* !SKYWALK */ 95*a325d9c4SApple OSS Distributions #define fq_empty(_q) MBUFQ_EMPTY(&(_q)->fq_mbufq) 96*a325d9c4SApple OSS Distributions #endif /* !SKYWALK */ 97*a325d9c4SApple OSS Distributions 98*a325d9c4SApple OSS Distributions #if SKYWALK 99*a325d9c4SApple OSS Distributions #define fq_enqueue(_q, _h, _t, _c) do { \ 100*a325d9c4SApple OSS Distributions switch ((_q)->fq_ptype) { \ 101*a325d9c4SApple OSS Distributions case QP_MBUF: \ 102*a325d9c4SApple OSS Distributions ASSERT((_h).cp_ptype == QP_MBUF); \ 103*a325d9c4SApple OSS Distributions ASSERT((_t).cp_ptype == QP_MBUF); \ 104*a325d9c4SApple OSS Distributions MBUFQ_ENQUEUE_MULTI(&(_q)->fq_mbufq, (_h).cp_mbuf, \ 105*a325d9c4SApple OSS Distributions (_t).cp_mbuf); \ 106*a325d9c4SApple OSS Distributions MBUFQ_ADD_CRUMB_MULTI(&(_q)->fq_mbufq, (_h).cp_mbuf, \ 107*a325d9c4SApple OSS Distributions (_t).cp_mbuf, PKT_CRUMB_FQ_ENQUEUE); \ 108*a325d9c4SApple OSS Distributions break; \ 109*a325d9c4SApple OSS Distributions case QP_PACKET: \ 110*a325d9c4SApple OSS Distributions ASSERT((_h).cp_ptype == QP_PACKET); \ 111*a325d9c4SApple OSS Distributions ASSERT((_t).cp_ptype == QP_PACKET); \ 112*a325d9c4SApple OSS Distributions KPKTQ_ENQUEUE_MULTI(&(_q)->fq_kpktq, (_h).cp_kpkt, \ 113*a325d9c4SApple OSS Distributions (_t).cp_kpkt, (_c)); \ 114*a325d9c4SApple OSS Distributions break; \ 115*a325d9c4SApple OSS Distributions default: \ 116*a325d9c4SApple OSS Distributions VERIFY(0); \ 117*a325d9c4SApple OSS Distributions __builtin_unreachable(); \ 118*a325d9c4SApple OSS Distributions break; \ 119*a325d9c4SApple OSS Distributions } \ 120*a325d9c4SApple OSS Distributions } while (0) 121*a325d9c4SApple OSS Distributions #else /* !SKYWALK */ 122*a325d9c4SApple OSS Distributions #define fq_enqueue(_q, _h, _t, _c) do { \ 123*a325d9c4SApple OSS Distributions MBUFQ_ENQUEUE_MULTI(&(_q)->fq_mbufq, (_h).cp_mbuf, \ 124*a325d9c4SApple OSS Distributions (_t).cp_mbuf); \ 125*a325d9c4SApple OSS Distributions MBUFQ_ADD_CRUMB_MULTI(&(_q)->fq_mbufq, (_h).cp_mbuf, \ 126*a325d9c4SApple OSS Distributions (_t).cp_mbuf, PKT_CRUMB_FQ_ENQUEUE); \ 127*a325d9c4SApple OSS Distributions } while (0) 128*a325d9c4SApple OSS Distributions #endif /* !SKYWALK */ 129*a325d9c4SApple OSS Distributions 130*a325d9c4SApple OSS Distributions #if SKYWALK 131*a325d9c4SApple OSS Distributions #define fq_dequeue(_q, _p) do { \ 132*a325d9c4SApple OSS Distributions switch ((_q)->fq_ptype) { \ 133*a325d9c4SApple OSS Distributions case QP_MBUF: { \ 134*a325d9c4SApple OSS Distributions MBUFQ_DEQUEUE(&(_q)->fq_mbufq, (_p)->cp_mbuf); \ 135*a325d9c4SApple OSS Distributions if (__probable((_p)->cp_mbuf != NULL)) { \ 136*a325d9c4SApple OSS Distributions CLASSQ_PKT_INIT_MBUF((_p), (_p)->cp_mbuf); \ 137*a325d9c4SApple OSS Distributions m_add_crumb((_p)->cp_mbuf, \ 138*a325d9c4SApple OSS Distributions PKT_CRUMB_FQ_DEQUEUE); \ 139*a325d9c4SApple OSS Distributions } \ 140*a325d9c4SApple OSS Distributions break; \ 141*a325d9c4SApple OSS Distributions } \ 142*a325d9c4SApple OSS Distributions case QP_PACKET: { \ 143*a325d9c4SApple OSS Distributions KPKTQ_DEQUEUE(&(_q)->fq_kpktq, (_p)->cp_kpkt); \ 144*a325d9c4SApple OSS Distributions if (__probable((_p)->cp_kpkt != NULL)) { \ 145*a325d9c4SApple OSS Distributions CLASSQ_PKT_INIT_PACKET((_p), (_p)->cp_kpkt); \ 146*a325d9c4SApple OSS Distributions } \ 147*a325d9c4SApple OSS Distributions break; \ 148*a325d9c4SApple OSS Distributions } \ 149*a325d9c4SApple OSS Distributions default: \ 150*a325d9c4SApple OSS Distributions VERIFY(0); \ 151*a325d9c4SApple OSS Distributions __builtin_unreachable(); \ 152*a325d9c4SApple OSS Distributions break; \ 153*a325d9c4SApple OSS Distributions } \ 154*a325d9c4SApple OSS Distributions } while (0) 155*a325d9c4SApple OSS Distributions #else /* !SKYWALK */ 156*a325d9c4SApple OSS Distributions #define fq_dequeue(_q, _p) do { \ 157*a325d9c4SApple OSS Distributions MBUFQ_DEQUEUE(&(_q)->fq_mbufq, (_p)->cp_mbuf); \ 158*a325d9c4SApple OSS Distributions if (__probable((_p)->cp_mbuf != NULL)) { \ 159*a325d9c4SApple OSS Distributions CLASSQ_PKT_INIT_MBUF((_p), (_p)->cp_mbuf); \ 160*a325d9c4SApple OSS Distributions m_add_crumb((_p)->cp_mbuf, PKT_CRUMB_FQ_DEQUEUE); \ 161*a325d9c4SApple OSS Distributions } \ 162*a325d9c4SApple OSS Distributions } while (0) 163*a325d9c4SApple OSS Distributions #endif /* !SKYWALK */ 164*a325d9c4SApple OSS Distributions 165*a325d9c4SApple OSS Distributions struct fq_codel_sched_data; 166*a325d9c4SApple OSS Distributions struct fq_if_classq; 167*a325d9c4SApple OSS Distributions 168*a325d9c4SApple OSS Distributions /* Function definitions */ 169*a325d9c4SApple OSS Distributions extern void fq_codel_init(void); 170*a325d9c4SApple OSS Distributions extern void fq_codel_reap_caches(boolean_t); 171*a325d9c4SApple OSS Distributions extern fq_t *fq_alloc(classq_pkt_type_t); 172*a325d9c4SApple OSS Distributions extern void fq_destroy(fq_t *); 173*a325d9c4SApple OSS Distributions extern int fq_addq(struct fq_codel_sched_data *, pktsched_pkt_t *, 174*a325d9c4SApple OSS Distributions struct fq_if_classq *); 175*a325d9c4SApple OSS Distributions extern void fq_getq_flow(struct fq_codel_sched_data *, fq_t *, 176*a325d9c4SApple OSS Distributions pktsched_pkt_t *); 177*a325d9c4SApple OSS Distributions extern void fq_getq_flow_internal(struct fq_codel_sched_data *, 178*a325d9c4SApple OSS Distributions fq_t *, pktsched_pkt_t *); 179*a325d9c4SApple OSS Distributions extern void fq_head_drop(struct fq_codel_sched_data *, fq_t *); 180*a325d9c4SApple OSS Distributions 181*a325d9c4SApple OSS Distributions #ifdef __cplusplus 182*a325d9c4SApple OSS Distributions } 183*a325d9c4SApple OSS Distributions #endif 184*a325d9c4SApple OSS Distributions #endif /* BSD_KERNEL_PRIVATE */ 185*a325d9c4SApple OSS Distributions #endif /* PRIVATE */ 186*a325d9c4SApple OSS Distributions #endif /* _NET_CLASSQ_CLASSQ_FQ_CODEL_H */ 187