dsmark: get rid of wrappers
Subsystems (3)
PATCH 1/4 dsmark: get rid of wrappers
Remove extraneous macro wrappers for printk and qdisc_priv.
net/sched/sch_dsmark.c +34 -49
@@ -15,23 +15,6 @@#include <net/inet_ecn.h> #include <asm/byteorder.h> - -#if 0 /* control */ -#define DPRINTK(format,args...) printk(KERN_DEBUG format,##args) -#else -#define DPRINTK(format,args...) -#endif - -#if 0 /* data */ -#define D2PRINTK(format,args...) printk(KERN_DEBUG format,##args) -#else -#define D2PRINTK(format,args...) -#endif - - -#define PRIV (sch) ((struct dsmark_qdisc_data *) qdisc_priv(sch)) - -/* * classid class marking * ------- ----- -------
@@ -81,9 +64,9 @@ static inline int dsmark_valid_index(strstatic int dsmark_graft (struct Qdisc *sch,unsigned long arg,struct Qdisc *new,struct Qdisc **old) { -struct dsmark_qdisc_data *p =PRIV (sch); +struct dsmark_qdisc_data *p =qdisc_priv (sch); -DPRINTK ("dsmark_graft(sch %p,[qdisc %p],new %p,old %p)\n" , +pr_debug ("dsmark_graft(sch %p,[qdisc %p],new %p,old %p)\n" , sch, p, new, old);if (new ==NULL ) {
@@ -104,13 +87,14 @@ static int dsmark_graft(struct Qdisc *scstatic struct Qdisc *dsmark_leaf (struct Qdisc *sch,unsigned long arg) { -return PRIV (sch)->q; +struct dsmark_qdisc_data *p =qdisc_priv (sch); +return p->q; }static unsigned long dsmark_get (struct Qdisc *sch,u32 classid) { -DPRINTK ("dsmark_get(sch %p,[qdisc %p],classid %x)\n" , - sch,PRIV (sch), classid); +pr_debug ("dsmark_get(sch %p,[qdisc %p],classid %x)\n" , + sch,qdisc_priv (sch), classid);return TC_H_MIN (classid) +1 ; }
@@ -128,13 +112,13 @@ static void dsmark_put(struct Qdisc *schstatic int dsmark_change (struct Qdisc *sch,u32 classid,u32 parent,struct rtattr **tca,unsigned long *arg) { -struct dsmark_qdisc_data *p =PRIV (sch); +struct dsmark_qdisc_data *p =qdisc_priv (sch);struct rtattr *opt = tca[TCA_OPTIONS -1 ];struct rtattr *tb[TCA_DSMARK_MAX ];int err = -EINVAL ;u8 mask =0 ; -DPRINTK ("dsmark_change(sch %p,[qdisc %p],classid %x,parent %x)," +pr_debug ("dsmark_change(sch %p,[qdisc %p],classid %x,parent %x)," "arg 0x%lx\n" , sch, p, classid, parent, *arg);if (!dsmark_valid_index (p, *arg)) {
@@ -162,7 +146,7 @@ rtattr_failure:static int dsmark_delete (struct Qdisc *sch,unsigned long arg) { -struct dsmark_qdisc_data *p =PRIV (sch); +struct dsmark_qdisc_data *p =qdisc_priv (sch);if (!dsmark_valid_index (p, arg))return -EINVAL ;
@@ -175,10 +159,10 @@ static int dsmark_delete(struct Qdisc *sstatic void dsmark_walk (struct Qdisc *sch,struct qdisc_walker *walker) { -struct dsmark_qdisc_data *p =PRIV (sch); +struct dsmark_qdisc_data *p =qdisc_priv (sch);int i; -DPRINTK ("dsmark_walk(sch %p,[qdisc %p],walker %p)\n" , sch, p, walker); +pr_debug ("dsmark_walk(sch %p,[qdisc %p],walker %p)\n" , sch, p, walker);if (walker->stop)return ;
@@ -197,19 +181,20 @@ ignore: } } -static struct tcf_proto **dsmark_find_tcf (struct Qdisc *sch,unsigned long cl) +static inline struct tcf_proto **dsmark_find_tcf (struct Qdisc *sch,unsigned long cl) { -return &PRIV (sch)->filter_list; +struct dsmark_qdisc_data *p =qdisc_priv (sch); +return &p->filter_list; }/* --------------------------- Qdisc operations ---------------------------- */ static int dsmark_enqueue (struct sk_buff *skb,struct Qdisc *sch) { -struct dsmark_qdisc_data *p =PRIV (sch); +struct dsmark_qdisc_data *p =qdisc_priv (sch);int err; -D2PRINTK ("dsmark_enqueue(skb %p,sch %p,[qdisc %p])\n" , skb, sch, p); +pr_debug ("dsmark_enqueue(skb %p,sch %p,[qdisc %p])\n" , skb, sch, p);if (p->set_tc_index) {/* FIXME: Safe with non-linear skbs? --RR */
@@ -234,7 +219,7 @@ static int dsmark_enqueue(struct sk_buffstruct tcf_result res;int result =tc_classify (skb, p->filter_list, &res); -D2PRINTK ("result %d class 0x%04x\n" , result, res.classid); +pr_debug ("result %d class 0x%04x\n" , result, res.classid);switch (result) {#ifdef CONFIG_NET_CLS_ACT
@@ -272,11 +257,11 @@ static int dsmark_enqueue(struct sk_buffstatic struct sk_buff *dsmark_dequeue (struct Qdisc *sch) { -struct dsmark_qdisc_data *p =PRIV (sch); +struct dsmark_qdisc_data *p =qdisc_priv (sch);struct sk_buff *skb;u32 index; -D2PRINTK ("dsmark_dequeue(sch %p,[qdisc %p])\n" , sch, p); +pr_debug ("dsmark_dequeue(sch %p,[qdisc %p])\n" , sch, p); skb = p->q->ops->dequeue (p->q);if (skb ==NULL )
@@ -285,7 +270,7 @@ static struct sk_buff *dsmark_dequeue(st sch->q.qlen--; index = skb->tc_index & (p->indices -1 ); -D2PRINTK ("index %d->%d\n" , skb->tc_index, index); +pr_debug ("index %d->%d\n" , skb->tc_index, index);switch (skb->protocol) {case __constant_htons (ETH_P_IP ):
@@ -314,10 +299,10 @@ static struct sk_buff *dsmark_dequeue(ststatic int dsmark_requeue (struct sk_buff *skb,struct Qdisc *sch) { -struct dsmark_qdisc_data *p =PRIV (sch); +struct dsmark_qdisc_data *p =qdisc_priv (sch);int err; -D2PRINTK ("dsmark_requeue(skb %p,sch %p,[qdisc %p])\n" , skb, sch, p); +pr_debug ("dsmark_requeue(skb %p,sch %p,[qdisc %p])\n" , skb, sch, p); err = p->q->ops->requeue (skb, p->q);if (err !=NET_XMIT_SUCCESS ) {
@@ -333,10 +318,10 @@ static int dsmark_requeue(struct sk_buffstatic unsigned int dsmark_drop (struct Qdisc *sch) { -struct dsmark_qdisc_data *p =PRIV (sch); +struct dsmark_qdisc_data *p =qdisc_priv (sch);unsigned int len; -DPRINTK ("dsmark_reset(sch %p,[qdisc %p])\n" , sch, p); +pr_debug ("dsmark_reset(sch %p,[qdisc %p])\n" , sch, p);if (p->q->ops->drop ==NULL )return 0 ;
@@ -350,14 +335,14 @@ static unsigned int dsmark_drop(struct Qstatic int dsmark_init (struct Qdisc *sch,struct rtattr *opt) { -struct dsmark_qdisc_data *p =PRIV (sch); +struct dsmark_qdisc_data *p =qdisc_priv (sch);struct rtattr *tb[TCA_DSMARK_MAX ];int err = -EINVAL ;u32 default_index =NO_DEFAULT_INDEX ;u16 indices;u8 *mask; -DPRINTK ("dsmark_init(sch %p,[qdisc %p],opt %p)\n" , sch, p, opt); +pr_debug ("dsmark_init(sch %p,[qdisc %p],opt %p)\n" , sch, p, opt);if (!opt ||rtattr_parse_nested (tb,TCA_DSMARK_MAX , opt) <0 ) goto errout;
@@ -389,7 +374,7 @@ static int dsmark_init(struct Qdisc *schif (p->q ==NULL ) p->q = &noop_qdisc; -DPRINTK ("dsmark_init: qdisc %p\n" , p->q); +pr_debug ("dsmark_init: qdisc %p\n" , p->q); err =0 ; errout:
@@ -399,18 +384,18 @@ rtattr_failure:static void dsmark_reset (struct Qdisc *sch) { -struct dsmark_qdisc_data *p =PRIV (sch); +struct dsmark_qdisc_data *p =qdisc_priv (sch); -DPRINTK ("dsmark_reset(sch %p,[qdisc %p])\n" , sch, p); +pr_debug ("dsmark_reset(sch %p,[qdisc %p])\n" , sch, p);qdisc_reset (p->q); sch->q.qlen =0 ; }static void dsmark_destroy (struct Qdisc *sch) { -struct dsmark_qdisc_data *p =PRIV (sch); +struct dsmark_qdisc_data *p =qdisc_priv (sch); -DPRINTK ("dsmark_destroy(sch %p,[qdisc %p])\n" , sch, p); +pr_debug ("dsmark_destroy(sch %p,[qdisc %p])\n" , sch, p);tcf_destroy_chain (p->filter_list);qdisc_destroy (p->q);
@@ -420,10 +405,10 @@ static void dsmark_destroy(struct Qdiscstatic int dsmark_dump_class (struct Qdisc *sch,unsigned long cl,struct sk_buff *skb,struct tcmsg *tcm) { -struct dsmark_qdisc_data *p =PRIV (sch); +struct dsmark_qdisc_data *p =qdisc_priv (sch);struct rtattr *opts =NULL ; -DPRINTK ("dsmark_dump_class(sch %p,[qdisc %p],class %ld\n" , sch, p, cl); +pr_debug ("dsmark_dump_class(sch %p,[qdisc %p],class %ld\n" , sch, p, cl);if (!dsmark_valid_index (p, cl))return -EINVAL ;
@@ -443,7 +428,7 @@ rtattr_failure:static int dsmark_dump (struct Qdisc *sch,struct sk_buff *skb) { -struct dsmark_qdisc_data *p =PRIV (sch); +struct dsmark_qdisc_data *p =qdisc_priv (sch);struct rtattr *opts =NULL ; opts =RTA_NEST (skb,TCA_OPTIONS );
PATCH 3/4 dsmark: handle cloned and non-linear skb's
Make dsmark work properly with non-linear and cloned skb's Before modifying the header, it needs to check that skb header is writeable.
Note: this makes the assumption, that if it queues a good skb then a good skb will come out of the embedded qdisc.
net/sched/sch_dsmark.c +15 -4
@@ -192,13 +192,19 @@ static int dsmark_enqueue(struct sk_buffpr_debug ("dsmark_enqueue(skb %p,sch %p,[qdisc %p])\n" , skb, sch, p);if (p->set_tc_index) { -/* FIXME: Safe with non-linear skbs? --RR */ switch (skb->protocol) {case __constant_htons (ETH_P_IP ): +if (skb_cow_head (skb,sizeof (struct iphdr ))) + goto drop; + skb->tc_index =ipv4_get_dsfield (ip_hdr (skb)) & ~INET_ECN_MASK ;break ; +case __constant_htons (ETH_P_IPV6 ): +if (skb_cow_head (skb,sizeof (struct ipv6hdr ))) + goto drop; + skb->tc_index =ipv6_get_dsfield (ipv6_hdr (skb)) & ~INET_ECN_MASK ;break ;
@@ -222,14 +228,14 @@ static int dsmark_enqueue(struct sk_buffcase TC_ACT_STOLEN :kfree_skb (skb);return NET_XMIT_SUCCESS ; +case TC_ACT_SHOT : -kfree_skb (skb); - sch->qstats.drops++; -return NET_XMIT_BYPASS ; + goto drop;#endif case TC_ACT_OK : skb->tc_index =TC_H_MIN (res.classid);break ; +default :if (p->default_index !=NO_DEFAULT_INDEX ) skb->tc_index = p->default_index;
@@ -248,6 +254,11 @@ static int dsmark_enqueue(struct sk_buff sch->q.qlen++;return NET_XMIT_SUCCESS ; + +drop: +kfree_skb (skb); + sch->qstats.drops++; +return NET_XMIT_BYPASS ; }static struct sk_buff *dsmark_dequeue (struct Qdisc *sch)
Re: [PATCH 3/4] dsmark: handle cloned and non-linear skb's
From: Stephen Hemminger <[email protected]>
Date: Sun, 20 Jan 2008 13:23:54 -0800
Quoted 8 lines
Make dsmark work properly with non-linear and cloned skb's Before modifying the header, it needs to check that skb header is writeable.
Note: this makes the assumption, that if it queues a good skb then a good skb will come out of the embedded qdisc.
Signed-off-by Stephen Hemminger <[email protected]>
Applied.
PATCH 4/4 dsmark: checkpatch warning cleanup
In reply to Stephen HemmingerGet rid of all style things checkpatch warns about, indentation and whitespace.
net/sched/sch_dsmark.c +40 -39
@@ -152,7 +152,7 @@ static int dsmark_delete(struct Qdisc *sreturn 0 ; } -static void dsmark_walk (struct Qdisc *sch,struct qdisc_walker *walker) +static void dsmark_walk (struct Qdisc *sch,struct qdisc_walker *walker) {struct dsmark_qdisc_data *p =qdisc_priv (sch);int i;
@@ -176,7 +176,8 @@ ignore: } } -static inline struct tcf_proto **dsmark_find_tcf (struct Qdisc *sch,unsigned long cl) +static inline struct tcf_proto **dsmark_find_tcf (struct Qdisc *sch, +unsigned long cl) {struct dsmark_qdisc_data *p =qdisc_priv (sch);return &p->filter_list;
@@ -184,7 +185,7 @@ static inline struct tcf_proto **dsmark_/* --------------------------- Qdisc operations ---------------------------- */ -static int dsmark_enqueue (struct sk_buff *skb,struct Qdisc *sch) +static int dsmark_enqueue (struct sk_buff *skb,struct Qdisc *sch) {struct dsmark_qdisc_data *p =qdisc_priv (sch);int err;
@@ -193,24 +194,24 @@ static int dsmark_enqueue(struct sk_buffif (p->set_tc_index) {switch (skb->protocol) { -case __constant_htons (ETH_P_IP ): -if (skb_cow_head (skb,sizeof (struct iphdr ))) - goto drop; +case __constant_htons (ETH_P_IP ): +if (skb_cow_head (skb,sizeof (struct iphdr ))) + goto drop; - skb->tc_index =ipv4_get_dsfield (ip_hdr (skb)) - & ~INET_ECN_MASK ; -break ; + skb->tc_index =ipv4_get_dsfield (ip_hdr (skb)) + & ~INET_ECN_MASK ; +break ; -case __constant_htons (ETH_P_IPV6 ): -if (skb_cow_head (skb,sizeof (struct ipv6hdr ))) - goto drop; +case __constant_htons (ETH_P_IPV6 ): +if (skb_cow_head (skb,sizeof (struct ipv6hdr ))) + goto drop; - skb->tc_index =ipv6_get_dsfield (ipv6_hdr (skb)) - & ~INET_ECN_MASK ; -break ; -default : - skb->tc_index =0 ; -break ; + skb->tc_index =ipv6_get_dsfield (ipv6_hdr (skb)) + & ~INET_ECN_MASK ; +break ; +default : + skb->tc_index =0 ; +break ; } }
@@ -243,7 +244,7 @@ static int dsmark_enqueue(struct sk_buff } } - err = p->q->enqueue (skb,p->q); + err = p->q->enqueue (skb, p->q);if (err !=NET_XMIT_SUCCESS ) { sch->qstats.drops++;return err;
@@ -279,31 +280,31 @@ static struct sk_buff *dsmark_dequeue(stpr_debug ("index %d->%d\n" , skb->tc_index, index);switch (skb->protocol) { -case __constant_htons (ETH_P_IP ): -ipv4_change_dsfield (ip_hdr (skb), p->mask[index], - p->value[index]); +case __constant_htons (ETH_P_IP ): +ipv4_change_dsfield (ip_hdr (skb), p->mask[index], + p->value[index]);break ; -case __constant_htons (ETH_P_IPV6 ): -ipv6_change_dsfield (ipv6_hdr (skb), p->mask[index], - p->value[index]); -break ; -default : -/* -* Only complain if a change was actually attempted. -* This way, we can send non-IP traffic through dsmark -* and don't need yet another qdisc as a bypass. -*/ -if (p->mask[index] !=0xff || p->value[index]) -printk (KERN_WARNING "dsmark_dequeue: " -"unsupported protocol %d\n" , -ntohs (skb->protocol)); +case __constant_htons (ETH_P_IPV6 ): +ipv6_change_dsfield (ipv6_hdr (skb), p->mask[index], + p->value[index]);break ; +default : +/* +* Only complain if a change was actually attempted. +* This way, we can send non-IP traffic through dsmark +* and don't need yet another qdisc as a bypass. +*/ +if (p->mask[index] !=0xff || p->value[index]) +printk (KERN_WARNING +"dsmark_dequeue: unsupported protocol %d\n" , +ntohs (skb->protocol)); +break ; }return skb; } -static int dsmark_requeue (struct sk_buff *skb,struct Qdisc *sch) +static int dsmark_requeue (struct sk_buff *skb,struct Qdisc *sch) {struct dsmark_qdisc_data *p =qdisc_priv (sch);int err;
@@ -423,8 +424,8 @@ static int dsmark_dump_class(struct Qdis tcm->tcm_info = p->q->handle; opts =RTA_NEST (skb,TCA_OPTIONS ); -RTA_PUT_U8 (skb,TCA_DSMARK_MASK , p->mask[cl-1 ]); -RTA_PUT_U8 (skb,TCA_DSMARK_VALUE , p->value[cl-1 ]); +RTA_PUT_U8 (skb,TCA_DSMARK_MASK , p->mask[cl-1 ]); +RTA_PUT_U8 (skb,TCA_DSMARK_VALUE , p->value[cl-1 ]);return RTA_NEST_END (skb, opts);
Re: [PATCH 4/4] dsmark: checkpatch warning cleanup
From: Stephen Hemminger <[email protected]>
Date: Sun, 20 Jan 2008 13:25:36 -0800
Quoted 4 lines
Get rid of all style things checkpatch warns about, indentation and whitespace.
Signed-off-by Stephen Hemminger <[email protected]>
Applied, thanks.
From: Stephen Hemminger <[email protected]>
Date: Sun, 20 Jan 2008 13:10:08 -0800
Quoted 3 lines
Remove extraneous macro wrappers for printk and
qdisc_priv.Signed-off-by Stephen Hemminger <[email protected]>
APplied.