Lines Matching +full:1 +full:p
25 * x:0 1 use entry [0]
27 * x:y y>0 y+1 use entry [y]
29 * x:indices-1 indices use entry [indices-1]
31 * x:y y+1 use entry [y & (indices-1)]
33 * 0xffff 0x10000 use entry [indices-1]
37 #define NO_DEFAULT_INDEX (1 << 16)
56 static inline int dsmark_valid_index(struct dsmark_qdisc_data *p, u16 index) in dsmark_valid_index() argument
58 return index <= p->indices && index > 0; in dsmark_valid_index()
67 struct dsmark_qdisc_data *p = qdisc_priv(sch); in dsmark_graft() local
69 pr_debug("%s(sch %p,[qdisc %p],new %p,old %p)\n", in dsmark_graft()
70 __func__, sch, p, new, old); in dsmark_graft()
79 *old = qdisc_replace(sch, new, &p->q); in dsmark_graft()
85 struct dsmark_qdisc_data *p = qdisc_priv(sch); in dsmark_leaf() local
86 return p->q; in dsmark_leaf()
91 return TC_H_MIN(classid) + 1; in dsmark_find()
97 pr_debug("%s(sch %p,[qdisc %p],classid %x)\n", in dsmark_bind_filter()
107 static const struct nla_policy dsmark_policy[TCA_DSMARK_MAX + 1] = {
119 struct dsmark_qdisc_data *p = qdisc_priv(sch); in dsmark_change() local
121 struct nlattr *tb[TCA_DSMARK_MAX + 1]; in dsmark_change()
124 pr_debug("%s(sch %p,[qdisc %p],classid %x,parent %x), arg 0x%lx\n", in dsmark_change()
125 __func__, sch, p, classid, parent, *arg); in dsmark_change()
127 if (!dsmark_valid_index(p, *arg)) { in dsmark_change()
140 p->mv[*arg - 1].value = nla_get_u8(tb[TCA_DSMARK_VALUE]); in dsmark_change()
143 p->mv[*arg - 1].mask = nla_get_u8(tb[TCA_DSMARK_MASK]); in dsmark_change()
153 struct dsmark_qdisc_data *p = qdisc_priv(sch); in dsmark_delete() local
155 if (!dsmark_valid_index(p, arg)) in dsmark_delete()
158 p->mv[arg - 1].mask = 0xff; in dsmark_delete()
159 p->mv[arg - 1].value = 0; in dsmark_delete()
166 struct dsmark_qdisc_data *p = qdisc_priv(sch); in dsmark_walk() local
169 pr_debug("%s(sch %p,[qdisc %p],walker %p)\n", in dsmark_walk()
170 __func__, sch, p, walker); in dsmark_walk()
175 for (i = 0; i < p->indices; i++) { in dsmark_walk()
176 if (p->mv[i].mask == 0xff && !p->mv[i].value) in dsmark_walk()
179 if (walker->fn(sch, i + 1, walker) < 0) { in dsmark_walk()
180 walker->stop = 1; in dsmark_walk()
192 struct dsmark_qdisc_data *p = qdisc_priv(sch); in dsmark_tcf_block() local
194 return p->block; in dsmark_tcf_block()
202 struct dsmark_qdisc_data *p = qdisc_priv(sch); in dsmark_enqueue() local
205 pr_debug("%s(skb %p,sch %p,[qdisc %p])\n", __func__, skb, sch, p); in dsmark_enqueue()
207 if (p->set_tc_index) { in dsmark_enqueue()
240 struct tcf_proto *fl = rcu_dereference_bh(p->filter_list); in dsmark_enqueue()
261 if (p->default_index != NO_DEFAULT_INDEX) in dsmark_enqueue()
262 skb->tc_index = p->default_index; in dsmark_enqueue()
267 err = qdisc_enqueue(skb, p->q, to_free); in dsmark_enqueue()
286 struct dsmark_qdisc_data *p = qdisc_priv(sch); in dsmark_dequeue() local
290 pr_debug("%s(sch %p,[qdisc %p])\n", __func__, sch, p); in dsmark_dequeue()
292 skb = qdisc_dequeue_peeked(p->q); in dsmark_dequeue()
300 index = skb->tc_index & (p->indices - 1); in dsmark_dequeue()
305 ipv4_change_dsfield(ip_hdr(skb), p->mv[index].mask, in dsmark_dequeue()
306 p->mv[index].value); in dsmark_dequeue()
309 ipv6_change_dsfield(ipv6_hdr(skb), p->mv[index].mask, in dsmark_dequeue()
310 p->mv[index].value); in dsmark_dequeue()
318 if (p->mv[index].mask != 0xff || p->mv[index].value) in dsmark_dequeue()
329 struct dsmark_qdisc_data *p = qdisc_priv(sch); in dsmark_peek() local
331 pr_debug("%s(sch %p,[qdisc %p])\n", __func__, sch, p); in dsmark_peek()
333 return p->q->ops->peek(p->q); in dsmark_peek()
339 struct dsmark_qdisc_data *p = qdisc_priv(sch); in dsmark_init() local
340 struct nlattr *tb[TCA_DSMARK_MAX + 1]; in dsmark_init()
346 pr_debug("%s(sch %p,[qdisc %p],opt %p)\n", __func__, sch, p, opt); in dsmark_init()
351 err = tcf_block_get(&p->block, &p->filter_list, sch, extack); in dsmark_init()
364 if (hweight32(indices) != 1) in dsmark_init()
371 p->mv = p->embedded; in dsmark_init()
373 p->mv = kmalloc_array(indices, sizeof(*p->mv), GFP_KERNEL); in dsmark_init()
374 if (!p->mv) { in dsmark_init()
379 p->mv[i].mask = 0xff; in dsmark_init()
380 p->mv[i].value = 0; in dsmark_init()
382 p->indices = indices; in dsmark_init()
383 p->default_index = default_index; in dsmark_init()
384 p->set_tc_index = nla_get_flag(tb[TCA_DSMARK_SET_TC_INDEX]); in dsmark_init()
386 p->q = qdisc_create_dflt(sch->dev_queue, &pfifo_qdisc_ops, sch->handle, in dsmark_init()
388 if (p->q == NULL) in dsmark_init()
389 p->q = &noop_qdisc; in dsmark_init()
391 qdisc_hash_add(p->q, true); in dsmark_init()
393 pr_debug("%s: qdisc %p\n", __func__, p->q); in dsmark_init()
402 struct dsmark_qdisc_data *p = qdisc_priv(sch); in dsmark_reset() local
404 pr_debug("%s(sch %p,[qdisc %p])\n", __func__, sch, p); in dsmark_reset()
405 qdisc_reset(p->q); in dsmark_reset()
412 struct dsmark_qdisc_data *p = qdisc_priv(sch); in dsmark_destroy() local
414 pr_debug("%s(sch %p,[qdisc %p])\n", __func__, sch, p); in dsmark_destroy()
416 tcf_block_put(p->block); in dsmark_destroy()
417 qdisc_destroy(p->q); in dsmark_destroy()
418 if (p->mv != p->embedded) in dsmark_destroy()
419 kfree(p->mv); in dsmark_destroy()
425 struct dsmark_qdisc_data *p = qdisc_priv(sch); in dsmark_dump_class() local
428 pr_debug("%s(sch %p,[qdisc %p],class %ld\n", __func__, sch, p, cl); in dsmark_dump_class()
430 if (!dsmark_valid_index(p, cl)) in dsmark_dump_class()
433 tcm->tcm_handle = TC_H_MAKE(TC_H_MAJ(sch->handle), cl - 1); in dsmark_dump_class()
434 tcm->tcm_info = p->q->handle; in dsmark_dump_class()
439 if (nla_put_u8(skb, TCA_DSMARK_MASK, p->mv[cl - 1].mask) || in dsmark_dump_class()
440 nla_put_u8(skb, TCA_DSMARK_VALUE, p->mv[cl - 1].value)) in dsmark_dump_class()
452 struct dsmark_qdisc_data *p = qdisc_priv(sch); in dsmark_dump() local
458 if (nla_put_u16(skb, TCA_DSMARK_INDICES, p->indices)) in dsmark_dump()
461 if (p->default_index != NO_DEFAULT_INDEX && in dsmark_dump()
462 nla_put_u16(skb, TCA_DSMARK_DEFAULT_INDEX, p->default_index)) in dsmark_dump()
465 if (p->set_tc_index && in dsmark_dump()