Thank you! I have looked at the changes and I'm very thankful for your comments. Thank you for pointing out nl_msg_put_u32 and nl_attr_get_u32, I somehow missed it. I also forgot to check for trailing whitespace, sorry about that.
I hope that I again will have the opportunity to work on Open vSwitch, and thanks again for all the help. On 03/23/2015 09:56 PM, Ben Pfaff wrote: > On Wed, Mar 18, 2015 at 05:13:01PM +0100, Jonathan Vestin wrote: >> This patch adds support for SFQ, CoDel and FQ_CoDel classless qdiscs to Open >> vSwitch. It also removes the requirement for a QoS to have at least one >> Queue (as this makes no sense when using classless qdiscs). I have also not >> implemented class_{get,set,delete,get_stats,dump_stats} because they are >> meant for qdiscs with classes. >> >> Signed-off-by: Jonathan Vestin <jonav...@kau.se> > Thanks for the contribution! I applied this to master. I folded in > the following incremental changes. Most of them are purely stylistic > (including a lot of removal of trailing white space) but you might > want to notice the nl_msg_put_u32() and nl_attr_get_u32() functions > for next time. > > Thanks again! > > diff --git a/AUTHORS b/AUTHORS > index db4520f..8fba915 100644 > --- a/AUTHORS > +++ b/AUTHORS > @@ -85,6 +85,7 @@ Jesse Gross je...@nicira.com > Jing Ai ji...@google.com > Joe Perches j...@perches.com > Joe Stringer joestrin...@nicira.com > +Jonathan Vestin jonav...@kau.se > Jun Nakajima jun.nakaj...@intel.com > Justin Pettit jpet...@nicira.com > Keith Amidon ke...@nicira.com > @@ -268,7 +269,6 @@ Joan Cirer j...@ev0.net > John Darrington j...@darrington.wattle.id.au > John Galgay j...@galgay.net > John Hurley john.hur...@netronome.com > -Jonathan Vestin jonav...@kau.se > K 華 k940...@hotmail.com > Kevin Mancuso kevin.manc...@rackspace.com > Kiran Shanbhog ki...@vmware.com > diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c > index 65f2555..8253dfb 100644 > --- a/lib/netdev-linux.c > +++ b/lib/netdev-linux.c > @@ -2856,7 +2856,7 @@ codel_get__(const struct netdev *netdev_) > } > > static void > -codel_install__(struct netdev *netdev_, uint32_t target, uint32_t limit, > +codel_install__(struct netdev *netdev_, uint32_t target, uint32_t limit, > uint32_t interval) > { > struct netdev_linux *netdev = netdev_linux_cast(netdev_); > @@ -2872,7 +2872,7 @@ codel_install__(struct netdev *netdev_, uint32_t > target, uint32_t limit, > } > > static int > -codel_setup_qdisc__(struct netdev *netdev, uint32_t target, uint32_t limit, > +codel_setup_qdisc__(struct netdev *netdev, uint32_t target, uint32_t limit, > uint32_t interval) > { > size_t opt_offset; > @@ -2897,18 +2897,17 @@ codel_setup_qdisc__(struct netdev *netdev, uint32_t > target, uint32_t limit, > > nl_msg_put_string(&request, TCA_KIND, "codel"); > opt_offset = nl_msg_start_nested(&request, TCA_OPTIONS); > - nl_msg_put_unspec(&request, TCA_CODEL_TARGET, &otarget, sizeof otarget); > - nl_msg_put_unspec(&request, TCA_CODEL_LIMIT, &olimit, sizeof olimit); > - nl_msg_put_unspec(&request, TCA_CODEL_INTERVAL, &ointerval, > - sizeof ointerval); > + nl_msg_put_u32(&request, TCA_CODEL_TARGET, otarget); > + nl_msg_put_u32(&request, TCA_CODEL_LIMIT, olimit); > + nl_msg_put_u32(&request, TCA_CODEL_INTERVAL, ointerval); > nl_msg_end_nested(&request, opt_offset); > > error = tc_transact(&request, NULL); > if (error) { > VLOG_WARN_RL(&rl, "failed to replace %s qdisc, " > - "target %u, limit %u, interval %u error %d(%s)", > + "target %u, limit %u, interval %u error %d(%s)", > netdev_get_name(netdev), > - otarget, olimit, ointerval, > + otarget, olimit, ointerval, > error, ovs_strerror(error)); > } > return error; > @@ -2930,9 +2929,15 @@ codel_parse_qdisc_details__(struct netdev *netdev > OVS_UNUSED, > codel->limit = limit_s ? strtoull(limit_s, NULL, 10) : 0; > codel->interval = interval_s ? strtoull(interval_s, NULL, 10) : 0; > > - if (!codel->target) codel->target = 5000; > - if (!codel->limit) codel->limit = 10240; > - if (!codel->interval) codel->interval = 100000; > + if (!codel->target) { > + codel->target = 5000; > + } > + if (!codel->limit) { > + codel->limit = 10240; > + } > + if (!codel->interval) { > + codel->interval = 100000; > + } > } > > static int > @@ -2942,7 +2947,7 @@ codel_tc_install(struct netdev *netdev, const struct > smap *details) > struct codel codel; > > codel_parse_qdisc_details__(netdev, details, &codel); > - error = codel_setup_qdisc__(netdev, codel.target, codel.limit, > + error = codel_setup_qdisc__(netdev, codel.target, codel.limit, > codel.interval); > if (!error) { > codel_install__(netdev, codel.target, codel.limit, codel.interval); > @@ -2967,9 +2972,9 @@ codel_parse_tca_options__(struct nlattr *nl_options, > struct codel *codel) > return EPROTO; > } > > - codel->target = *((uint32_t *)nl_attr_get(attrs[TCA_CODEL_TARGET])); > - codel->limit = *((uint32_t *)nl_attr_get(attrs[TCA_CODEL_LIMIT])); > - codel->interval = *((uint32_t *)nl_attr_get(attrs[TCA_CODEL_INTERVAL])); > + codel->target = nl_attr_get_u32(attrs[TCA_CODEL_TARGET]); > + codel->limit = nl_attr_get_u32(attrs[TCA_CODEL_LIMIT]); > + codel->interval = nl_attr_get_u32(attrs[TCA_CODEL_INTERVAL]); > return 0; > } > > @@ -3042,7 +3047,7 @@ static const struct tc_ops tc_ops_codel = { > NULL, > NULL > }; > - > + > /* FQ-CoDel traffic control class. */ > > #define FQCODEL_N_QUEUES 0x0000 > @@ -3064,7 +3069,7 @@ fqcodel_get__(const struct netdev *netdev_) > } > > static void > -fqcodel_install__(struct netdev *netdev_, uint32_t target, uint32_t limit, > +fqcodel_install__(struct netdev *netdev_, uint32_t target, uint32_t limit, > uint32_t interval, uint32_t flows, uint32_t quantum) > { > struct netdev_linux *netdev = netdev_linux_cast(netdev_); > @@ -3082,7 +3087,7 @@ fqcodel_install__(struct netdev *netdev_, uint32_t > target, uint32_t limit, > } > > static int > -fqcodel_setup_qdisc__(struct netdev *netdev, uint32_t target, uint32_t > limit, > +fqcodel_setup_qdisc__(struct netdev *netdev, uint32_t target, uint32_t limit, > uint32_t interval, uint32_t flows, uint32_t quantum) > { > size_t opt_offset; > @@ -3105,26 +3110,24 @@ fqcodel_setup_qdisc__(struct netdev *netdev, uint32_t > target, uint32_t limit, > olimit = limit ? limit : 10240; > ointerval = interval ? interval : 100000; > oflows = flows ? flows : 1024; > - oquantum = quantum ? quantum : 1514; /* fq_codel default quantum is 1514 > + oquantum = quantum ? quantum : 1514; /* fq_codel default quantum is 1514 > not mtu */ > > nl_msg_put_string(&request, TCA_KIND, "fq_codel"); > opt_offset = nl_msg_start_nested(&request, TCA_OPTIONS); > - nl_msg_put_unspec(&request, TCA_FQ_CODEL_TARGET, &otarget, sizeof > otarget); > - nl_msg_put_unspec(&request, TCA_FQ_CODEL_LIMIT, &olimit, sizeof olimit); > - nl_msg_put_unspec(&request, TCA_FQ_CODEL_INTERVAL, &ointerval, > - sizeof ointerval); > - nl_msg_put_unspec(&request, TCA_FQ_CODEL_FLOWS, &oflows, sizeof oflows); > - nl_msg_put_unspec(&request, TCA_FQ_CODEL_QUANTUM, &oquantum, > - sizeof oquantum); > + nl_msg_put_u32(&request, TCA_FQ_CODEL_TARGET, otarget); > + nl_msg_put_u32(&request, TCA_FQ_CODEL_LIMIT, olimit); > + nl_msg_put_u32(&request, TCA_FQ_CODEL_INTERVAL, ointerval); > + nl_msg_put_u32(&request, TCA_FQ_CODEL_FLOWS, oflows); > + nl_msg_put_u32(&request, TCA_FQ_CODEL_QUANTUM, oquantum); > nl_msg_end_nested(&request, opt_offset); > > error = tc_transact(&request, NULL); > if (error) { > VLOG_WARN_RL(&rl, "failed to replace %s qdisc, " > - "target %u, limit %u, interval %u, flows %u, quantum %u error > %d(%s)", > + "target %u, limit %u, interval %u, flows %u, quantum %u error > %d(%s)", > netdev_get_name(netdev), > - otarget, olimit, ointerval, oflows, oquantum, > + otarget, olimit, ointerval, oflows, oquantum, > error, ovs_strerror(error)); > } > return error; > @@ -3150,11 +3153,21 @@ fqcodel_parse_qdisc_details__(struct netdev *netdev > OVS_UNUSED, > fqcodel->interval = interval_s ? strtoull(interval_s, NULL, 10) : 0; > fqcodel->flows = flows_s ? strtoull(flows_s, NULL, 10) : 0; > fqcodel->quantum = quantum_s ? strtoull(quantum_s, NULL, 10) : 0; > - if (!fqcodel->target) fqcodel->target = 5000; > - if (!fqcodel->limit) fqcodel->limit = 10240; > - if (!fqcodel->interval) fqcodel->interval = 1000000; > - if (!fqcodel->flows) fqcodel->flows = 1024; > - if (!fqcodel->quantum) fqcodel->quantum = 1514; > + if (!fqcodel->target) { > + fqcodel->target = 5000; > + } > + if (!fqcodel->limit) { > + fqcodel->limit = 10240; > + } > + if (!fqcodel->interval) { > + fqcodel->interval = 1000000; > + } > + if (!fqcodel->flows) { > + fqcodel->flows = 1024; > + } > + if (!fqcodel->quantum) { > + fqcodel->quantum = 1514; > + } > } > > static int > @@ -3164,11 +3177,11 @@ fqcodel_tc_install(struct netdev *netdev, const > struct smap *details) > struct fqcodel fqcodel; > > fqcodel_parse_qdisc_details__(netdev, details, &fqcodel); > - error = fqcodel_setup_qdisc__(netdev, fqcodel.target, fqcodel.limit, > - fqcodel.interval, fqcodel.flows, > + error = fqcodel_setup_qdisc__(netdev, fqcodel.target, fqcodel.limit, > + fqcodel.interval, fqcodel.flows, > fqcodel.quantum); > if (!error) { > - fqcodel_install__(netdev, fqcodel.target, fqcodel.limit, > + fqcodel_install__(netdev, fqcodel.target, fqcodel.limit, > fqcodel.interval, fqcodel.flows, fqcodel.quantum); > } > return error; > @@ -3193,11 +3206,11 @@ fqcodel_parse_tca_options__(struct nlattr > *nl_options, struct fqcodel *fqcodel) > return EPROTO; > } > > - fqcodel->target = *((uint32_t *)nl_attr_get(attrs[TCA_FQ_CODEL_TARGET])); > - fqcodel->limit = *((uint32_t *)nl_attr_get(attrs[TCA_FQ_CODEL_LIMIT])); > - fqcodel->interval =*((uint32_t > *)nl_attr_get(attrs[TCA_FQ_CODEL_INTERVAL])); > - fqcodel->flows = *((uint32_t *)nl_attr_get(attrs[TCA_FQ_CODEL_FLOWS])); > - fqcodel->quantum = *((uint32_t > *)nl_attr_get(attrs[TCA_FQ_CODEL_QUANTUM])); > + fqcodel->target = nl_attr_get_u32(attrs[TCA_FQ_CODEL_TARGET]); > + fqcodel->limit = nl_attr_get_u32(attrs[TCA_FQ_CODEL_LIMIT]); > + fqcodel->interval =nl_attr_get_u32(attrs[TCA_FQ_CODEL_INTERVAL]); > + fqcodel->flows = nl_attr_get_u32(attrs[TCA_FQ_CODEL_FLOWS]); > + fqcodel->quantum = nl_attr_get_u32(attrs[TCA_FQ_CODEL_QUANTUM]); > return 0; > } > > @@ -3219,7 +3232,7 @@ fqcodel_tc_load(struct netdev *netdev, struct ofpbuf > *nlmsg) > return error; > } > > - fqcodel_install__(netdev, fqcodel.target, fqcodel.limit, > fqcodel.interval, > + fqcodel_install__(netdev, fqcodel.target, fqcodel.limit, > fqcodel.interval, > fqcodel.flows, fqcodel.quantum); > return 0; > } > @@ -3250,7 +3263,7 @@ fqcodel_qdisc_set(struct netdev *netdev, const struct > smap *details) > struct fqcodel fqcodel; > > fqcodel_parse_qdisc_details__(netdev, details, &fqcodel); > - fqcodel_install__(netdev, fqcodel.target, fqcodel.limit, > fqcodel.interval, > + fqcodel_install__(netdev, fqcodel.target, fqcodel.limit, > fqcodel.interval, > fqcodel.flows, fqcodel.quantum); > fqcodel_get__(netdev)->target = fqcodel.target; > fqcodel_get__(netdev)->limit = fqcodel.limit; > @@ -3275,7 +3288,7 @@ static const struct tc_ops tc_ops_fqcodel = { > NULL, > NULL > }; > - > + > /* SFQ traffic control class. */ > > #define SFQ_N_QUEUES 0x0000 > @@ -3329,17 +3342,16 @@ sfq_setup_qdisc__(struct netdev *netdev, uint32_t > quantum, uint32_t perturb) > > memset(&opt, 0, sizeof opt); > if (!quantum) { > - if (!mtu_error) > + if (!mtu_error) { > opt.quantum = mtu; /* if we cannot find mtu, use default */ > - } > - else { > + } > + } else { > opt.quantum = quantum; > } > > if (!perturb) { > opt.perturb_period = 10; > - } > - else { > + } else { > opt.perturb_period = perturb; > } > > @@ -3349,10 +3361,10 @@ sfq_setup_qdisc__(struct netdev *netdev, uint32_t > quantum, uint32_t perturb) > error = tc_transact(&request, NULL); > if (error) { > VLOG_WARN_RL(&rl, "failed to replace %s qdisc, " > - "quantum %u, perturb %u error %d(%s)", > - netdev_get_name(netdev), > - opt.quantum, opt.perturb_period, > - error, ovs_strerror(error)); > + "quantum %u, perturb %u error %d(%s)", > + netdev_get_name(netdev), > + opt.quantum, opt.perturb_period, > + error, ovs_strerror(error)); > } > return error; > } > @@ -3376,11 +3388,11 @@ sfq_parse_qdisc_details__(struct netdev *netdev, > > if (!sfq->quantum) { > mtu_error = netdev_linux_get_mtu__(netdev_linux_cast(netdev), &mtu); > - if(!mtu_error) { > + if (!mtu_error) { > sfq->quantum = mtu; > } else { > - VLOG_WARN_RL(&rl, "when using SFQ, you must specify quantum on a > " > - "device without mtu"); > + VLOG_WARN_RL(&rl, "when using SFQ, you must specify quantum on a > " > + "device without mtu"); > return; > } > } > @@ -3462,7 +3474,7 @@ static const struct tc_ops tc_ops_sfq = { > NULL, > NULL > }; > - > + > /* HTB traffic control class. */ > > #define HTB_N_QUEUES 0xf000 > diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml > index 466e7c0..07f3bea 100644 > --- a/vswitchd/vswitch.xml > +++ b/vswitchd/vswitch.xml > @@ -3152,19 +3152,28 @@ > <dl> > <dt><code>linux-sfq</code></dt> > <dd> > - Linux "Stochastic Fairness Queueing" classifier. See tc-sfq(8) > (also at <code>http://linux.die.net/man/8/tc-sfq</code> ) for information on > how this classifier works. > + Linux ``Stochastic Fairness Queueing'' classifier. See > + <code>tc-sfq</code>(8) (also at > + <code>http://linux.die.net/man/8/tc-sfq</code>) for information on > + how this classifier works. > </dd> > </dl> > <dl> > <dt><code>linux-codel</code></dt> > <dd> > - Linux "Controlled Delay" classifier. See tc-codel(8) (also at > <code>http://man7.org/linux/man-pages/man8/tc-codel.8.html</code> ) for > information on how this classifier works. > + Linux ``Controlled Delay'' classifier. See <code>tc-codel</code>(8) > + (also at > + <code>http://man7.org/linux/man-pages/man8/tc-codel.8.html</code>) > + for information on how this classifier works. > </dd> > </dl> > <dl> > <dt><code>linux-fq_codel</code></dt> > <dd> > - Linux "Fair Queuing with Controlled Delay" classifier. See > tc-fq_codel(8) (also at > <code>http://man7.org/linux/man-pages/man8/tc-fq_codel.8.html</code> ) for > information on how this classifier works. > + Linux ``Fair Queuing with Controlled Delay'' classifier. See > + <code>tc-fq_codel</code>(8) (also at > + > <code>http://man7.org/linux/man-pages/man8/tc-fq_codel.8.html</code>) > + for information on how this classifier works. > </dd> > </dl> > </column> _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev