13 #include <linux/types.h>
14 #include <linux/kernel.h>
15 #include <linux/string.h>
16 #include <linux/errno.h>
18 #include <linux/rtnetlink.h>
19 #include <linux/module.h>
26 #define GACT_TAB_MASK 15
28 static u32 gact_idx_gen;
37 #ifdef CONFIG_GACT_PROB
38 static int gact_net_rand(
struct tcf_gact *gact)
40 if (!gact->tcfg_pval ||
net_random() % gact->tcfg_pval)
41 return gact->tcf_action;
42 return gact->tcfg_paction;
45 static int gact_determ(
struct tcf_gact *gact)
47 if (!gact->tcfg_pval || gact->tcf_bstats.packets % gact->tcfg_pval)
48 return gact->tcf_action;
49 return gact->tcfg_paction;
53 static g_rand gact_rand[
MAX_RAND] = {
NULL, gact_net_rand, gact_determ };
62 struct tc_action *
a,
int ovr,
int bind)
70 #ifdef CONFIG_GACT_PROB
77 err = nla_parse_nested(tb,
TCA_GACT_MAX, nla, gact_policy);
85 #ifndef CONFIG_GACT_PROB
90 p_parm = nla_data(tb[TCA_GACT_PROB]);
99 bind, &gact_idx_gen, &gact_hash_info);
112 spin_lock_bh(&gact->tcf_lock);
113 gact->tcf_action = parm->action;
114 #ifdef CONFIG_GACT_PROB
116 gact->tcfg_paction = p_parm->
paction;
117 gact->tcfg_pval = p_parm->
pval;
118 gact->tcfg_ptype = p_parm->
ptype;
121 spin_unlock_bh(&gact->tcf_lock);
122 if (ret == ACT_P_CREATED)
127 static int tcf_gact_cleanup(
struct tc_action *a,
int bind)
142 spin_lock(&gact->tcf_lock);
143 #ifdef CONFIG_GACT_PROB
144 if (gact->tcfg_ptype)
145 action = gact_rand[gact->tcfg_ptype](gact);
147 action = gact->tcf_action;
149 action = gact->tcf_action;
151 gact->tcf_bstats.bytes += qdisc_pkt_len(skb);
152 gact->tcf_bstats.packets++;
154 gact->tcf_qstats.drops++;
155 gact->tcf_tm.lastuse =
jiffies;
156 spin_unlock(&gact->tcf_lock);
161 static int tcf_gact_dump(
struct sk_buff *skb,
struct tc_action *a,
int bind,
int ref)
163 unsigned char *
b = skb_tail_pointer(skb);
166 .index = gact->tcf_index,
167 .refcnt = gact->tcf_refcnt - ref,
168 .bindcnt = gact->tcf_bindcnt - bind,
169 .action = gact->tcf_action,
174 goto nla_put_failure;
175 #ifdef CONFIG_GACT_PROB
176 if (gact->tcfg_ptype) {
179 .pval = gact->tcfg_pval,
180 .ptype = gact->tcfg_ptype,
183 if (
nla_put(skb, TCA_GACT_PROB,
sizeof(p_opt), &p_opt))
184 goto nla_put_failure;
191 goto nla_put_failure;
199 static struct tc_action_ops act_gact_ops = {
201 .hinfo = &gact_hash_info,
203 .capab = TCA_CAP_NONE,
206 .dump = tcf_gact_dump,
207 .cleanup = tcf_gact_cleanup,
209 .init = tcf_gact_init,
217 static int __init gact_init_module(
void)
219 #ifdef CONFIG_GACT_PROB
220 pr_info(
"GACT probability on\n");
222 pr_info(
"GACT probability NOT on\n");
227 static void __exit gact_cleanup_module(
void)