aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/sched/sch_dsmark.c52
1 files changed, 24 insertions, 28 deletions
diff --git a/net/sched/sch_dsmark.c b/net/sched/sch_dsmark.c
index 66abf139f4bf..ac0efeae312e 100644
--- a/net/sched/sch_dsmark.c
+++ b/net/sched/sch_dsmark.c
@@ -428,50 +428,46 @@ static void dsmark_destroy(struct Qdisc *sch)
428 428
429 429
430static int dsmark_dump_class(struct Qdisc *sch, unsigned long cl, 430static int dsmark_dump_class(struct Qdisc *sch, unsigned long cl,
431 struct sk_buff *skb, struct tcmsg *tcm) 431 struct sk_buff *skb, struct tcmsg *tcm)
432{ 432{
433 struct dsmark_qdisc_data *p = PRIV(sch); 433 struct dsmark_qdisc_data *p = PRIV(sch);
434 unsigned char *b = skb->tail; 434 struct rtattr *opts = NULL;
435 struct rtattr *rta;
436 435
437 DPRINTK("dsmark_dump_class(sch %p,[qdisc %p],class %ld\n",sch,p,cl); 436 DPRINTK("dsmark_dump_class(sch %p,[qdisc %p],class %ld\n", sch, p, cl);
438 if (!cl || cl > p->indices) 437
438 if (!dsmark_valid_index(p, cl))
439 return -EINVAL; 439 return -EINVAL;
440 tcm->tcm_handle = TC_H_MAKE(TC_H_MAJ(sch->handle),cl-1); 440
441 rta = (struct rtattr *) b; 441 tcm->tcm_handle = TC_H_MAKE(TC_H_MAJ(sch->handle), cl-1);
442 RTA_PUT(skb,TCA_OPTIONS,0,NULL); 442
443 RTA_PUT(skb,TCA_DSMARK_MASK,1,&p->mask[cl-1]); 443 opts = RTA_NEST(skb, TCA_OPTIONS);
444 RTA_PUT(skb,TCA_DSMARK_VALUE,1,&p->value[cl-1]); 444 RTA_PUT_U8(skb,TCA_DSMARK_MASK, p->mask[cl-1]);
445 rta->rta_len = skb->tail-b; 445 RTA_PUT_U8(skb,TCA_DSMARK_VALUE, p->value[cl-1]);
446 return skb->len; 446
447 return RTA_NEST_END(skb, opts);
447 448
448rtattr_failure: 449rtattr_failure:
449 skb_trim(skb,b-skb->data); 450 return RTA_NEST_CANCEL(skb, opts);
450 return -1;
451} 451}
452 452
453static int dsmark_dump(struct Qdisc *sch, struct sk_buff *skb) 453static int dsmark_dump(struct Qdisc *sch, struct sk_buff *skb)
454{ 454{
455 struct dsmark_qdisc_data *p = PRIV(sch); 455 struct dsmark_qdisc_data *p = PRIV(sch);
456 unsigned char *b = skb->tail; 456 struct rtattr *opts = NULL;
457 struct rtattr *rta;
458 457
459 rta = (struct rtattr *) b; 458 opts = RTA_NEST(skb, TCA_OPTIONS);
460 RTA_PUT(skb,TCA_OPTIONS,0,NULL); 459 RTA_PUT_U16(skb, TCA_DSMARK_INDICES, p->indices);
461 RTA_PUT(skb,TCA_DSMARK_INDICES,sizeof(__u16),&p->indices); 460
462 if (p->default_index != NO_DEFAULT_INDEX) { 461 if (p->default_index != NO_DEFAULT_INDEX)
463 __u16 tmp = p->default_index; 462 RTA_PUT_U16(skb, TCA_DSMARK_DEFAULT_INDEX, p->default_index);
464 463
465 RTA_PUT(skb,TCA_DSMARK_DEFAULT_INDEX, sizeof(__u16), &tmp);
466 }
467 if (p->set_tc_index) 464 if (p->set_tc_index)
468 RTA_PUT(skb, TCA_DSMARK_SET_TC_INDEX, 0, NULL); 465 RTA_PUT_FLAG(skb, TCA_DSMARK_SET_TC_INDEX);
469 rta->rta_len = skb->tail-b; 466
470 return skb->len; 467 return RTA_NEST_END(skb, opts);
471 468
472rtattr_failure: 469rtattr_failure:
473 skb_trim(skb,b-skb->data); 470 return RTA_NEST_CANCEL(skb, opts);
474 return -1;
475} 471}
476 472
477static struct Qdisc_class_ops dsmark_class_ops = { 473static struct Qdisc_class_ops dsmark_class_ops = {