I will send it today.

Best,
Miguel Angel
El 12/4/2016 20:33, "Ben Pfaff" <b...@ovn.org> escribió:

> Would you like to submit a fix?
>
> On Tue, Apr 12, 2016 at 01:34:28PM +0200, Miguel Angel Ajo Pelayo wrote:
> > After looking at iproute2/tc sources and ovs sources, I believe the
> > error is in ovs,
> > In tc, the burst is calculated with
> >
> >    tc_calc_xmittime(size, rate) = tick_in_us * TIME_UNITS_PER_SEC *
> (size/rate)
> >
> >    tick_in_us seems to be the number of ticks in a microsecond,
> >    and TIME_UNITS_PER_SEC is 1000000
> >
> > In ovs the burst is calculated with tc_bytes_to_ticks(rate, size) =
> > ticks_per_s * (size/rate)
> > and we pass "size" as bits, while it should be bytes.
> >
> > https://github.com/openvswitch/ovs/blob/master/lib/netdev-linux.c#L4736
> >
> > it should be (kbits_burst * 1024) / 8 instead of kbits_burst*1024
> >
> > If somebody could doublecheck, that'd be great.
> >
> >
> >
> >
> > On Tue, Apr 12, 2016 at 11:05 AM, Miguel Angel Ajo Pelayo
> > <majop...@redhat.com> wrote:
> > > Hi Ben,
> > >
> > >    I think slawe is not worried about the 1000 vs 1024 difference.
> > >
> > >    But on the fact that when setting 1000kbit burst on an policy,
> > >    when you check via tc cmdline, you see 1000kbyte.
> > >
> > >    Is TC command line reporting it wrong?, is it TC API?, or is it a
> > > bug in OVS?.
> > >
> > >    I'm reading the TC API and cmdline tool trying to identify that,
> > > but I probably don't have the expertise... we will see..
> > >
> > > Best regards,
> > >
> > > On Sun, Apr 10, 2016 at 10:25 PM, Ben Pfaff <b...@ovn.org> wrote:
> > >> No, I'm talking about the rest of the comment, please read it again.
> > >> The difference between 1000 vs 1024 bits is a trivial 2.4% difference.
> > >>
> > >> On Sun, Apr 10, 2016 at 09:46:28PM +0200, Sławek Kapłoński wrote:
> > >>> Hello,
> > >>>
> > >>> Thx for anwear and checking that. AFAIU You are talking about issue
> with SI
> > >>> and IEC units and problem with it.
> > >>> I'm not talking about such issue or not issue. What I pointed here
> is that
> > >>> (from comment in ovs code) ovs is doing something like:
> > >>> "sbin/tc filter add dev <devname> parent ffff: protocol all prio 49
> basic
> > >>> police rate <kbits_rate>kbit burst <kbits_burst>k
> > >>> "
> > >>> please note this <kbit_burst>k
> > >>> but problem is that when You give "k" to tc it is not kilobits but
> kiloBYTES.
> > >>> So ovs should do something like "....  burst <kbits_burst>kbit" in
> this
> > >>> command. Or maybe it is intentional to use "k" there so IMHO message
> in
> > >>> comment should be something like "... burst <kilobyte_burst>k"
> > >>>
> > >>> --
> > >>> Pozdrawiam / Best regards
> > >>> Sławek Kapłoński
> > >>> sla...@kaplonski.pl
> > >>>
> > >>> Dnia niedziela, 10 kwietnia 2016 12:36:46 CEST Ben Pfaff pisze:
> > >>> > On Thu, Apr 07, 2016 at 09:28:50PM +0200, Sławek Kapłoński wrote:
> > >>> > > Hello,
> > >>> > >
> > >>> > > I'm playing littlebit with ingress policing in openvswitch and I
> found
> > >>> > > some
> > >>> > > kind of inconsistency.
> > >>> > > In docs and in source code
> > >>> > > (https://github.com/openvswitch/ovs/blob/master/
> > >>> > > lib/netdev-linux.c#L4698) there is info that burst is set in
> kilobits, but
> > >>> > > I found that in fact it is set in kilobytes in tc.
> > >>> > > So long story short:
> > >>> > >
> > >>> > > root@ubuntu-1604-test:/home/ubuntu# ovs-vsctl show
> > >>> > > f0d1f90d-174f-47bf-89bc-bf37f2da0271
> > >>> > >
> > >>> > >     Bridge "br1"
> > >>> > >
> > >>> > >         Port vethA
> > >>> > >
> > >>> > >             Interface vethA
> > >>> > >
> > >>> > >         Port "br1"
> > >>> > >
> > >>> > >             Interface "br1"
> > >>> > >
> > >>> > >                 type: internal
> > >>> > >
> > >>> > >     ovs_version: "2.5.0"
> > >>> > >
> > >>> > > root@ubuntu-1604-test:/home/ubuntu# ovs-vsctl set Interface
> vethA
> > >>> > > ingress_policing_rate=1000 -- set Interface vethA
> > >>> > > ingress_policing_burst=100
> > >>> > >
> > >>> > > root@ubuntu-1604-test:/home/ubuntu# ovs-vsctl list interface
> vethA | grep
> > >>> > > ingress
> > >>> > > ingress_policing_burst: 100
> > >>> > > ingress_policing_rate: 1000
> > >>> > >
> > >>> > >
> > >>> > > results in:
> > >>> > > root@ubuntu-1604-test:/home/ubuntu# tc filter show dev vethA
> parent ffff:
> > >>> > > filter protocol all pref 49 basic
> > >>> > > filter protocol all pref 49 basic handle 0x1
> > >>> > >
> > >>> > >  police 0x1 rate 1Mbit burst 100Kb mtu 64Kb action drop overhead
> 0b
> > >>> > >
> > >>> > > ref 1 bind 1
> > >>> > >
> > >>> > >
> > >>> > > As You can see above, burst is given in "Kb" units what,
> according to tc
> > >>> > > man (http://lartc.org/manpages/tc.txt) means kilobytes.
> > >>> > >
> > >>> > > So question: is it intentional inconsistency or bug? If bug then
> where: in
> > >>> > > code or in docs?
> > >>> >
> > >>> > We applied a fix to the policing code last year, in the following
> > >>> > commit.  If you read the long comment that it adds, and then
> compare
> > >>> > that with what you're saying, it sounds like tc once had a bug
> where it
> > >>> > confused bits and bytes, and we modified OVS so that it had the
> same
> > >>> > bug.  Presumably, now tc's bug has been fixed, and so we should
> fix OVS
> > >>> > the same way.
> > >>> >
> > >>> > --8<--------------------------cut
> here-------------------------->8--
> > >>> >
> > >>> > From: Ben Pfaff <b...@nicira.com>
> > >>> > Date: Fri, 13 Mar 2015 11:30:18 -0700
> > >>> > Subject: [PATCH] netdev-linux: Be more careful about integer
> overflow in
> > >>> >  policing.
> > >>> >
> > >>> > Otherwise the policing limits could make no sense if large rates
> were
> > >>> > specified.
> > >>> >
> > >>> > Reported-by: Zhangguanghui <zhang.guang...@h3c.com>
> > >>> > Signed-off-by: Ben Pfaff <b...@nicira.com>
> > >>> > Acked-by: Ansis Atteka <aatt...@nicira.com>
> > >>> > ---
> > >>> >  AUTHORS            |  1 +
> > >>> >  lib/netdev-linux.c | 29 ++++++++++++++++++++++-------
> > >>> >  vswitchd/bridge.c  |  4 ++--
> > >>> >  3 files changed, 25 insertions(+), 9 deletions(-)
> > >>> >
> > >>> > diff --git a/AUTHORS b/AUTHORS
> > >>> > index fe79acd..d7925db 100644
> > >>> > --- a/AUTHORS
> > >>> > +++ b/AUTHORS
> > >>> > @@ -345,6 +345,7 @@ Voravit T.              vora...@kth.se
> > >>> >  Yeming Zhao             zhaoyem...@gmail.com
> > >>> >  Ying Chen               yingc...@vmware.com
> > >>> >  Yongqiang Liu           liuyq7...@gmail.com
> > >>> > +Zhangguanghui           zhang.guang...@h3c.com
> > >>> >  Ziyou Wang              ziy...@vmware.com
> > >>> >  Zoltán Balogh           zoltan.bal...@ericsson.com
> > >>> >  ankur dwivedi           ankurengg2...@gmail.com
> > >>> > diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c
> > >>> > index 662ccc9..6e574cd 100644
> > >>> > --- a/lib/netdev-linux.c
> > >>> > +++ b/lib/netdev-linux.c
> > >>> > @@ -1,5 +1,5 @@
> > >>> >  /*
> > >>> > - * Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014 Nicira, Inc.
> > >>> > + * Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2015 Nicira,
> Inc.
> > >>> >   *
> > >>> >   * Licensed under the Apache License, Version 2.0 (the "License");
> > >>> >   * you may not use this file except in compliance with the
> License.
> > >>> > @@ -399,8 +399,8 @@ static struct tcmsg *tc_make_request(const
> struct netdev
> > >>> > *, int type, unsigned int flags, struct ofpbuf *); static int
> > >>> > tc_transact(struct ofpbuf *request, struct ofpbuf **replyp);
> static int
> > >>> > tc_add_del_ingress_qdisc(struct netdev *netdev, bool add); -static
> int
> > >>> > tc_add_policer(struct netdev *netdev, int kbits_rate,
> > >>> > -                          int kbits_burst);
> > >>> > +static int tc_add_policer(struct netdev *,
> > >>> > +                          uint32_t kbits_rate, uint32_t
> kbits_burst);
> > >>> >
> > >>> >  static int tc_parse_qdisc(const struct ofpbuf *, const char
> **kind,
> > >>> >                            struct nlattr **options);
> > >>> > @@ -4028,12 +4028,13 @@ tc_add_del_ingress_qdisc(struct netdev
> *netdev, bool
> > >>> > add) *              mtu 65535 drop
> > >>> >   *
> > >>> >   * The configuration and stats may be seen with the following
> command:
> > >>> > - *     /sbin/tc -s filter show <devname> eth0 parent ffff:
> > >>> > + *     /sbin/tc -s filter show dev <devname> parent ffff:
> > >>> >   *
> > >>> >   * Returns 0 if successful, otherwise a positive errno value.
> > >>> >   */
> > >>> >  static int
> > >>> > -tc_add_policer(struct netdev *netdev, int kbits_rate, int
> kbits_burst)
> > >>> > +tc_add_policer(struct netdev *netdev,
> > >>> > +               uint32_t kbits_rate, uint32_t kbits_burst)
> > >>> >  {
> > >>> >      struct tc_police tc_police;
> > >>> >      struct ofpbuf request;
> > >>> > @@ -4047,8 +4048,22 @@ tc_add_policer(struct netdev *netdev, int
> kbits_rate,
> > >>> > int kbits_burst) tc_police.action = TC_POLICE_SHOT;
> > >>> >      tc_police.mtu = mtu;
> > >>> >      tc_fill_rate(&tc_police.rate, ((uint64_t) kbits_rate *
> 1000)/8, mtu);
> > >>> > -    tc_police.burst = tc_bytes_to_ticks(tc_police.rate.rate,
> > >>> > -                                        kbits_burst * 1024);
> > >>> > +
> > >>> > +    /* The following appears wrong in two ways:
> > >>> > +     *
> > >>> > +     * - tc_bytes_to_ticks() should take "bytes" as quantity for
> both of
> > >>> > its +     *   arguments (or at least consistently "bytes" as both
> or "bits"
> > >>> > as +     *   both), but this supplies bytes for the first argument
> and bits
> > >>> > for the +     *   second.
> > >>> > +     *
> > >>> > +     * - In networking a kilobit is usually 1000 bits but this
> uses 1024
> > >>> > bits. +     *
> > >>> > +     * However if you "fix" those problems then "tc filter show
> ..." shows
> > >>> > +     * "125000b", meaning 125,000 bits, when OVS configures it
> for 1000
> > >>> > kbit == +     * 1,000,000 bits, whereas this actually ends up
> doing the
> > >>> > right thing from +     * tc's point of view.  Whatever. */
> > >>> > +    tc_police.burst = tc_bytes_to_ticks(
> > >>> > +        tc_police.rate.rate, MIN(UINT32_MAX / 1024, kbits_burst)
> * 1024);
> > >>> >
> > >>> >      tcmsg = tc_make_request(netdev, RTM_NEWTFILTER,
> > >>> >                              NLM_F_EXCL | NLM_F_CREATE, &request);
> > >>> > diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
> > >>> > index 85bbfa3..68648b9 100644
> > >>> > --- a/vswitchd/bridge.c
> > >>> > +++ b/vswitchd/bridge.c
> > >>> > @@ -4445,8 +4445,8 @@ iface_configure_qos(struct iface *iface,
> const struct
> > >>> > ovsrec_qos *qos) }
> > >>> >
> > >>> >      netdev_set_policing(iface->netdev,
> > >>> > -                        iface->cfg->ingress_policing_rate,
> > >>> > -                        iface->cfg->ingress_policing_burst);
> > >>> > +                        MIN(UINT32_MAX,
> iface->cfg->ingress_policing_rate),
> > >>> > +                        MIN(UINT32_MAX,
> > >>> > iface->cfg->ingress_policing_burst));
> > >>> >
> > >>> >      ofpbuf_uninit(&queues_buf);
> > >>> >  }
> > >>
> > >>
>
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to