6 #include <linux/module.h>
8 #include <linux/slab.h>
9 #include <linux/types.h>
10 #include <linux/string.h>
11 #include <linux/errno.h>
13 #include <linux/rtnetlink.h>
14 #include <linux/bitops.h>
18 #include <asm/byteorder.h>
36 #define NO_DEFAULT_INDEX (1 << 16)
50 return (index <= p->indices && index > 0);
55 static int dsmark_graft(
struct Qdisc *
sch,
unsigned long arg,
60 pr_debug(
"dsmark_graft(sch %p,[qdisc %p],new %p,old %p)\n",
80 static struct Qdisc *dsmark_leaf(
struct Qdisc *sch,
unsigned long arg)
86 static unsigned long dsmark_get(
struct Qdisc *sch,
u32 classid)
88 pr_debug(
"dsmark_get(sch %p,[qdisc %p],classid %x)\n",
89 sch, qdisc_priv(sch), classid);
94 static unsigned long dsmark_bind_filter(
struct Qdisc *sch,
95 unsigned long parent,
u32 classid)
97 return dsmark_get(sch, classid);
100 static void dsmark_put(
struct Qdisc *sch,
unsigned long cl)
112 static int dsmark_change(
struct Qdisc *sch,
u32 classid,
u32 parent,
121 pr_debug(
"dsmark_change(sch %p,[qdisc %p],classid %x,parent %x),"
122 "arg 0x%lx\n", sch, p, classid, parent, *arg);
124 if (!dsmark_valid_index(p, *arg)) {
137 mask = nla_get_u8(tb[TCA_DSMARK_MASK]);
140 p->
value[*arg - 1] = nla_get_u8(tb[TCA_DSMARK_VALUE]);
142 if (tb[TCA_DSMARK_MASK])
151 static int dsmark_delete(
struct Qdisc *sch,
unsigned long arg)
155 if (!dsmark_valid_index(p, arg))
158 p->
mask[arg - 1] = 0xff;
159 p->
value[arg - 1] = 0;
169 pr_debug(
"dsmark_walk(sch %p,[qdisc %p],walker %p)\n", sch, p, walker);
174 for (i = 0; i < p->
indices; i++) {
178 if (walker->
fn(sch, i + 1, walker) < 0) {
188 static inline struct tcf_proto **dsmark_find_tcf(
struct Qdisc *sch,
202 pr_debug(
"dsmark_enqueue(skb %p,sch %p,[qdisc %p])\n", skb, sch, p);
210 skb->tc_index = ipv4_get_dsfield(ip_hdr(skb))
218 skb->tc_index = ipv6_get_dsfield(ipv6_hdr(skb))
233 pr_debug(
"result %d class 0x%04x\n", result,
res.classid);
236 #ifdef CONFIG_NET_CLS_ACT
256 err = qdisc_enqueue(skb, p->
q);
268 qdisc_drop(skb, sch);
272 static struct sk_buff *dsmark_dequeue(
struct Qdisc *sch)
278 pr_debug(
"dsmark_dequeue(sch %p,[qdisc %p])\n", sch, p);
280 skb = p->
q->ops->dequeue(p->
q);
284 qdisc_bstats_update(sch, skb);
287 index = skb->tc_index & (p->
indices - 1);
288 pr_debug(
"index %d->%d\n", skb->tc_index, index);
292 ipv4_change_dsfield(ip_hdr(skb), p->mask[index],
296 ipv6_change_dsfield(ipv6_hdr(skb), p->mask[index],
305 if (p->
mask[index] != 0xff || p->
value[index])
306 pr_warning(
"dsmark_dequeue: unsupported protocol %d\n",
318 pr_debug(
"dsmark_peek(sch %p,[qdisc %p])\n", sch, p);
320 return p->
q->ops->peek(p->
q);
323 static unsigned int dsmark_drop(
struct Qdisc *sch)
328 pr_debug(
"dsmark_reset(sch %p,[qdisc %p])\n", sch, p);
330 if (p->
q->ops->drop ==
NULL)
333 len = p->
q->ops->drop(p->
q);
340 static int dsmark_init(
struct Qdisc *sch,
struct nlattr *opt)
349 pr_debug(
"dsmark_init(sch %p,[qdisc %p],opt %p)\n", sch, p, opt);
365 default_index = nla_get_u16(tb[TCA_DSMARK_DEFAULT_INDEX]);
387 pr_debug(
"dsmark_init: qdisc %p\n", p->
q);
394 static void dsmark_reset(
struct Qdisc *sch)
398 pr_debug(
"dsmark_reset(sch %p,[qdisc %p])\n", sch, p);
403 static void dsmark_destroy(
struct Qdisc *sch)
407 pr_debug(
"dsmark_destroy(sch %p,[qdisc %p])\n", sch, p);
414 static int dsmark_dump_class(
struct Qdisc *sch,
unsigned long cl,
420 pr_debug(
"dsmark_dump_class(sch %p,[qdisc %p],class %ld\n", sch, p, cl);
422 if (!dsmark_valid_index(p, cl))
430 goto nla_put_failure;
431 if (nla_put_u8(skb, TCA_DSMARK_MASK, p->
mask[cl - 1]) ||
432 nla_put_u8(skb, TCA_DSMARK_VALUE, p->
value[cl - 1]))
433 goto nla_put_failure;
435 return nla_nest_end(skb, opts);
438 nla_nest_cancel(skb, opts);
442 static int dsmark_dump(
struct Qdisc *sch,
struct sk_buff *skb)
449 goto nla_put_failure;
451 goto nla_put_failure;
454 nla_put_u16(skb, TCA_DSMARK_DEFAULT_INDEX, p->
default_index))
455 goto nla_put_failure;
459 goto nla_put_failure;
461 return nla_nest_end(skb, opts);
464 nla_nest_cancel(skb, opts);
469 .graft = dsmark_graft,
473 .change = dsmark_change,
474 .delete = dsmark_delete,
476 .tcf_chain = dsmark_find_tcf,
477 .bind_tcf = dsmark_bind_filter,
478 .unbind_tcf = dsmark_put,
479 .dump = dsmark_dump_class,
484 .cl_ops = &dsmark_class_ops,
487 .enqueue = dsmark_enqueue,
488 .dequeue = dsmark_dequeue,
492 .reset = dsmark_reset,
493 .destroy = dsmark_destroy,
499 static int __init dsmark_module_init(
void)
504 static void __exit dsmark_module_exit(
void)