#ifndef _NET_CLASSQ_CLASSQ_FQ_CODEL_H
#define _NET_CLASSQ_CLASSQ_FQ_CODEL_H
#ifdef PRIVATE
#ifdef BSD_KERNEL_PRIVATE
#include <stdbool.h>
#include <sys/time.h>
#include <net/flowadv.h>
#include <net/classq/if_classq.h>
#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 {
union {
MBUFQ_HEAD(mbufq_head) __mbufq;
} __fq_pktq_u;
#define FQF_FLOWCTL_CAPABLE 0x01
#define FQF_DELAY_HIGH 0x02
#define FQF_NEW_FLOW 0x04
#define FQF_OLD_FLOW 0x08
#define FQF_FLOWCTL_ON 0x10
u_int8_t fq_flags;
u_int8_t fq_sc_index;
int16_t fq_deficit;
u_int32_t fq_bytes;
u_int64_t fq_min_qdelay;
u_int64_t fq_updatetime;
u_int64_t fq_getqtime;
SLIST_ENTRY(flowq) fq_hashlink;
STAILQ_ENTRY(flowq) fq_actlink;
u_int32_t fq_flowhash;
classq_pkt_type_t fq_ptype;
} fq_t;
#define fq_mbufq __fq_pktq_u.__mbufq
#define fq_empty(_q) MBUFQ_EMPTY(&(_q)->fq_mbufq)
#define fq_enqueue(_q, _p) MBUFQ_ENQUEUE(&(_q)->fq_mbufq, (mbuf_t)_p)
#define fq_dequeue(_q, _p) do { \
mbuf_t _m; \
MBUFQ_DEQUEUE(&(_q)->fq_mbufq, _m); \
(_p) = _m; \
} while (0)
struct fq_codel_sched_data;
struct fq_if_classq;
extern void fq_codel_init(void);
extern void fq_codel_reap_caches(boolean_t);
extern fq_t *fq_alloc(classq_pkt_type_t);
extern void fq_destroy(fq_t *);
extern int fq_addq(struct fq_codel_sched_data *, pktsched_pkt_t *,
struct fq_if_classq *);
extern void *fq_getq_flow(struct fq_codel_sched_data *, fq_t *,
pktsched_pkt_t *);
extern void *fq_getq_flow_internal(struct fq_codel_sched_data *,
fq_t *, pktsched_pkt_t *);
extern void fq_head_drop(struct fq_codel_sched_data *, fq_t *);
#ifdef __cplusplus
}
#endif
#endif
#endif
#endif