#ifndef _PKTSCHED_PKTSCHED_H_
#define _PKTSCHED_PKTSCHED_H_
#ifdef PRIVATE
#ifdef __cplusplus
extern "C" {
#endif
#define PKTSCHEDT_NONE 0
#define PKTSCHEDT_CBQ 1
#define PKTSCHEDT_HFSC 2
#define PKTSCHEDT_PRIQ 3
#define PKTSCHEDT_FAIRQ 4
#define PKTSCHEDT_TCQ 5
#define PKTSCHEDT_QFQ 6
#define PKTSCHEDT_FQ_CODEL 7
#define PKTSCHEDT_MAX 8
#ifdef BSD_KERNEL_PRIVATE
#include <mach/mach_time.h>
#include <sys/sysctl.h>
#include <libkern/libkern.h>
#define PKTSCHEDF_QALG_SFB 0x01
#define PKTSCHEDF_QALG_ECN 0x02
#define PKTSCHEDF_QALG_FLOWCTL 0x04
#define PKTSCHEDF_QALG_DELAYBASED 0x08
#define PKTSCHEDF_QALG_DRIVER_MANAGED 0x10
typedef struct _pktsched_pkt_ {
classq_pkt_type_t __ptype;
uint32_t __plen;
void *__pkt;
#define pktsched_ptype __ptype
#define pktsched_plen __plen
#define pktsched_pkt __pkt
} pktsched_pkt_t;
#define _PKTSCHED_PKT_INIT(_p) do { \
(_p)->pktsched_ptype = QP_INVALID; \
(_p)->pktsched_plen = 0; \
(_p)->pktsched_pkt = NULL; \
} while (0)
struct callout {
void *c_arg;
void (*c_func)(void *);
};
#define CALLOUT_INIT(c) do { \
(void) memset((c), 0, sizeof (*(c))); \
} while ( 0)
#define CALLOUT_RESET(c, t, f, a) do { \
(c)->c_arg = (a); \
(c)->c_func = (f); \
timeout((f), (a), (t)); \
} while ( 0)
#define CALLOUT_STOP(c) untimeout((c)->c_func, (c)->c_arg)
#define CALLOUT_INITIALIZER { NULL, NULL }
typedef void (timeout_t)(void *);
typedef u_int32_t pktsched_bitmap_t;
static inline boolean_t
pktsched_bit_tst(u_int32_t ix, pktsched_bitmap_t *pData)
{
return (*pData & (1 << ix));
}
static inline void
pktsched_bit_set(u_int32_t ix, pktsched_bitmap_t *pData)
{
*pData |= (1 << ix);
}
static inline void
pktsched_bit_clr(u_int32_t ix, pktsched_bitmap_t *pData)
{
*pData &= ~(1 << ix);
}
static inline pktsched_bitmap_t
pktsched_ffs(pktsched_bitmap_t pData)
{
return (ffs(pData));
}
static inline pktsched_bitmap_t
pktsched_fls(pktsched_bitmap_t pData)
{
return ((sizeof (pktsched_bitmap_t) << 3) - clz(pData));
}
static inline pktsched_bitmap_t
__fls(pktsched_bitmap_t word)
{
VERIFY(word != 0);
return (pktsched_fls(word) - 1);
}
#define read_machclk() mach_absolute_time()
extern u_int32_t machclk_freq;
extern u_int64_t machclk_per_sec;
extern u_int32_t pktsched_verbose;
SYSCTL_DECL(_net_pktsched);
struct if_ifclassq_stats;
extern void pktsched_init(void);
extern int pktsched_setup(struct ifclassq *, u_int32_t, u_int32_t,
classq_pkt_type_t);
extern int pktsched_teardown(struct ifclassq *);
extern int pktsched_getqstats(struct ifclassq *, u_int32_t,
struct if_ifclassq_stats *);
extern u_int64_t pktsched_abs_to_nsecs(u_int64_t);
extern u_int64_t pktsched_nsecs_to_abstime(u_int64_t);
extern void pktsched_free_pkt(pktsched_pkt_t *);
extern uint32_t pktsched_get_pkt_len(pktsched_pkt_t *);
extern void pktsched_get_pkt_vars(pktsched_pkt_t *, uint32_t **, uint64_t **,
uint32_t *, uint8_t *, uint8_t *, uint32_t *);
extern uint32_t *pktsched_get_pkt_sfb_vars(pktsched_pkt_t *, uint32_t **);
extern void pktsched_pkt_encap(pktsched_pkt_t *, classq_pkt_type_t, void *);
extern mbuf_svc_class_t pktsched_get_pkt_svc(pktsched_pkt_t *);
extern struct flowadv_fcentry *pktsched_alloc_fcentry(pktsched_pkt_t *,
struct ifnet *, int);
#endif
#ifdef __cplusplus
}
#endif
#endif
#endif