X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/7e41aa883dd258f888d0470250eead40a53ef1f5..3903760236c30e3b5ace7a4eefac3a269d68957c:/bsd/net/classq/classq_fq_codel.h diff --git a/bsd/net/classq/classq_fq_codel.h b/bsd/net/classq/classq_fq_codel.h new file mode 100644 index 000000000..35f8341b2 --- /dev/null +++ b/bsd/net/classq/classq_fq_codel.h @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2016 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +#ifndef _NET_CLASSQ_CLASSQ_FQ_CODEL_H +#define _NET_CLASSQ_CLASSQ_FQ_CODEL_H +#ifdef PRIVATE +#ifdef BSD_KERNEL_PRIVATE +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define FQ_MIN_FC_THRESHOLD_BYTES 7500 +#define FQ_IS_DELAYHIGH(_fq_) ((_fq_)->fq_flags & FQF_DELAY_HIGH) +#define FQ_SET_DELAY_HIGH(_fq_) do { \ + (_fq_)->fq_flags |= FQF_DELAY_HIGH; \ +} while (0) +#define FQ_CLEAR_DELAY_HIGH(_fq_) do { \ + (_fq_)->fq_flags &= ~FQF_DELAY_HIGH; \ +} while (0) + +typedef struct flowq { + MBUFQ_HEAD(pktq_head) fq_mbufq; /* Packet queue */ +#define FQF_FLOWCTL_CAPABLE 0x01 /* Use flow control instead of drop */ +#define FQF_DELAY_HIGH 0x02 /* Min delay is greater than target */ +#define FQF_NEW_FLOW 0x04 /* Currently on new flows queue */ +#define FQF_OLD_FLOW 0x08 /* Currently on old flows queue */ +#define FQF_FLOWCTL_ON 0x10 /* Currently flow controlled */ + u_int8_t fq_flags; /* flags */ + u_int8_t fq_sc_index; /* service_class index */ + int16_t fq_deficit; /* Deficit for scheduling */ + u_int32_t fq_bytes; /* Number of bytes in the queue */ + u_int64_t fq_min_qdelay; /* min queue delay for Codel */ + u_int64_t fq_updatetime; /* next update interval */ + u_int64_t fq_getqtime; /* last dequeue time */ + SLIST_ENTRY(flowq) fq_hashlink; /* for flow queue hash table */ + STAILQ_ENTRY(flowq) fq_actlink; /* for new/old flow queues */ + u_int32_t fq_flowhash; /* Flow hash */ + u_int32_t fq_dequeue_seq; /* Last dequeue seq */ +} fq_t; + +struct fq_codel_sched_data; +struct fq_if_classq; + +/* Function definitions */ +extern void fq_codel_init(void); +extern fq_t *fq_alloc(int); +extern void fq_destroy(fq_t *); +extern int fq_addq(struct fq_codel_sched_data *, struct mbuf *, + struct fq_if_classq *); +extern struct mbuf *fq_getq_flow(struct fq_codel_sched_data *, fq_t *); +extern void fq_head_drop(struct fq_codel_sched_data *, fq_t *); + +#ifdef __cplusplus +} +#endif +#endif /* BSD_KERNEL_PRIVATE */ +#endif /* PRIVATE */ +#endif /* _NET_CLASSQ_CLASSQ_FQ_CODEL_H */