#include <linux/module.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/skbuff.h>
#include <linux/vmalloc.h>
#include <net/pkt_sched.h>
#include <net/pkt_cls.h>
#include <net/inet_ecn.h>
#include <net/red.h>
#include <net/flow_dissector.h>
#define CHOKE_MAX_QUEUE …
struct choke_sched_data { … };
static unsigned int choke_len(const struct choke_sched_data *q)
{ … }
static int use_ecn(const struct choke_sched_data *q)
{ … }
static int use_harddrop(const struct choke_sched_data *q)
{ … }
static void choke_zap_head_holes(struct choke_sched_data *q)
{ … }
static void choke_zap_tail_holes(struct choke_sched_data *q)
{ … }
static void choke_drop_by_idx(struct Qdisc *sch, unsigned int idx,
struct sk_buff **to_free)
{ … }
struct choke_skb_cb { … };
static inline struct choke_skb_cb *choke_skb_cb(const struct sk_buff *skb)
{ … }
static bool choke_match_flow(struct sk_buff *skb1,
struct sk_buff *skb2)
{ … }
static struct sk_buff *choke_peek_random(const struct choke_sched_data *q,
unsigned int *pidx)
{ … }
static bool choke_match_random(const struct choke_sched_data *q,
struct sk_buff *nskb,
unsigned int *pidx)
{ … }
static int choke_enqueue(struct sk_buff *skb, struct Qdisc *sch,
struct sk_buff **to_free)
{ … }
static struct sk_buff *choke_dequeue(struct Qdisc *sch)
{ … }
static void choke_reset(struct Qdisc *sch)
{ … }
static const struct nla_policy choke_policy[TCA_CHOKE_MAX + 1] = …;
static void choke_free(void *addr)
{ … }
static int choke_change(struct Qdisc *sch, struct nlattr *opt,
struct netlink_ext_ack *extack)
{ … }
static int choke_init(struct Qdisc *sch, struct nlattr *opt,
struct netlink_ext_ack *extack)
{ … }
static int choke_dump(struct Qdisc *sch, struct sk_buff *skb)
{ … }
static int choke_dump_stats(struct Qdisc *sch, struct gnet_dump *d)
{ … }
static void choke_destroy(struct Qdisc *sch)
{ … }
static struct sk_buff *choke_peek_head(struct Qdisc *sch)
{ … }
static struct Qdisc_ops choke_qdisc_ops __read_mostly = …;
MODULE_ALIAS_NET_SCH(…) …;
static int __init choke_module_init(void)
{ … }
static void __exit choke_module_exit(void)
{ … }
module_init(…) …
module_exit(…)
MODULE_LICENSE(…) …;
MODULE_DESCRIPTION(…) …;