Thanks, I pushed this to master.

On Sat, Nov 03, 2012 at 01:50:10PM -0700, Justin Pettit wrote:
> Looks good.
> 
> --Justin
> 
> 
> On Oct 24, 2012, at 1:44 PM, Ben Pfaff <b...@nicira.com> wrote:
> 
> > When a link is down, or when a link has no speed because it is not a
> > physical interface, Open vSwitch previously reported that its rate is 100
> > Mbps as a default.  This is counterintuitive, however, so this commit
> > changes Open vSwitch behavior to report 0 Mbps when a link is down or its
> > speed is otherwise unavailable.
> > 
> > Bug #13388.
> > Reported-by: Hiroshi Tanaka <htan...@nicira.com>
> > Signed-off-by: Ben Pfaff <b...@nicira.com>
> > ---
> > lib/netdev-linux.c           |    4 ++--
> > lib/netdev.c                 |    7 ++++---
> > lib/netdev.h                 |    3 ++-
> > lib/ofp-util.c               |    4 ++--
> > ofproto/ofproto-dpif-sflow.c |    2 +-
> > ofproto/ofproto.c            |    4 ++--
> > tests/ofp-print.at           |    2 +-
> > tests/ofproto.at             |   10 +++++-----
> > vswitchd/bridge.c            |   18 ++++++------------
> > 9 files changed, 25 insertions(+), 29 deletions(-)
> > 
> > diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c
> > index 412a92d..0460c06 100644
> > --- a/lib/netdev-linux.c
> > +++ b/lib/netdev-linux.c
> > @@ -2668,7 +2668,7 @@ htb_parse_qdisc_details__(struct netdev *netdev,
> >         enum netdev_features current;
> > 
> >         netdev_get_features(netdev, &current, NULL, NULL, NULL);
> > -        hc->max_rate = netdev_features_to_bps(current) / 8;
> > +        hc->max_rate = netdev_features_to_bps(current, 100 * 1000 * 1000) 
> > / 8;
> >     }
> >     hc->min_rate = hc->max_rate;
> >     hc->burst = 0;
> > @@ -3147,7 +3147,7 @@ hfsc_parse_qdisc_details__(struct netdev *netdev, 
> > const struct smap *details,
> >         enum netdev_features current;
> > 
> >         netdev_get_features(netdev, &current, NULL, NULL, NULL);
> > -        max_rate = netdev_features_to_bps(current) / 8;
> > +        max_rate = netdev_features_to_bps(current, 100 * 1000 * 1000) / 8;
> >     }
> > 
> >     class->min_rate = max_rate;
> > diff --git a/lib/netdev.c b/lib/netdev.c
> > index c135c6f..1921ac0 100644
> > --- a/lib/netdev.c
> > +++ b/lib/netdev.c
> > @@ -620,9 +620,10 @@ netdev_get_features(const struct netdev *netdev,
> > 
> > /* Returns the maximum speed of a network connection that has the NETDEV_F_*
> >  * bits in 'features', in bits per second.  If no bits that indicate a speed
> > - * are set in 'features', assumes 100Mbps. */
> > + * are set in 'features', returns 'default_bps'. */
> > uint64_t
> > -netdev_features_to_bps(enum netdev_features features)
> > +netdev_features_to_bps(enum netdev_features features,
> > +                       uint64_t default_bps)
> > {
> >     enum {
> >         F_1000000MB = NETDEV_F_1TB_FD,
> > @@ -641,7 +642,7 @@ netdev_features_to_bps(enum netdev_features features)
> >             : features & F_1000MB    ? UINT64_C(1000000000)
> >             : features & F_100MB     ? UINT64_C(100000000)
> >             : features & F_10MB      ? UINT64_C(10000000)
> > -                                     : UINT64_C(100000000));
> > +                                     : default_bps);
> > }
> > 
> > /* Returns true if any of the NETDEV_F_* bits that indicate a full-duplex 
> > link
> > diff --git a/lib/netdev.h b/lib/netdev.h
> > index d2cc8b5..67122ee 100644
> > --- a/lib/netdev.h
> > +++ b/lib/netdev.h
> > @@ -146,7 +146,8 @@ int netdev_get_features(const struct netdev *,
> >                         enum netdev_features *advertised,
> >                         enum netdev_features *supported,
> >                         enum netdev_features *peer);
> > -uint64_t netdev_features_to_bps(enum netdev_features features);
> > +uint64_t netdev_features_to_bps(enum netdev_features features,
> > +                                uint64_t default_bps);
> > bool netdev_features_is_full_duplex(enum netdev_features features);
> > int netdev_set_advertisements(struct netdev *, enum netdev_features 
> > advertise);
> > 
> > diff --git a/lib/ofp-util.c b/lib/ofp-util.c
> > index 34255da..ad59a34 100644
> > --- a/lib/ofp-util.c
> > +++ b/lib/ofp-util.c
> > @@ -2420,8 +2420,8 @@ ofputil_decode_ofp10_phy_port(struct ofputil_phy_port 
> > *pp,
> >     pp->supported = netdev_port_features_from_ofp10(opp->supported);
> >     pp->peer = netdev_port_features_from_ofp10(opp->peer);
> > 
> > -    pp->curr_speed = netdev_features_to_bps(pp->curr) / 1000;
> > -    pp->max_speed = netdev_features_to_bps(pp->supported) / 1000;
> > +    pp->curr_speed = netdev_features_to_bps(pp->curr, 0) / 1000;
> > +    pp->max_speed = netdev_features_to_bps(pp->supported, 0) / 1000;
> > 
> >     return 0;
> > }
> > diff --git a/ofproto/ofproto-dpif-sflow.c b/ofproto/ofproto-dpif-sflow.c
> > index 23f5498..37b662c 100644
> > --- a/ofproto/ofproto-dpif-sflow.c
> > +++ b/ofproto/ofproto-dpif-sflow.c
> > @@ -179,7 +179,7 @@ sflow_agent_get_counters(void *ds_, SFLPoller *poller,
> >     if (!netdev_get_features(dsp->ofport->netdev, &current, NULL, NULL, 
> > NULL)) {
> >         /* The values of ifDirection come from MAU MIB (RFC 2668): 0 = 
> > unknown,
> >            1 = full-duplex, 2 = half-duplex, 3 = in, 4=out */
> > -        counters->ifSpeed = netdev_features_to_bps(current);
> > +        counters->ifSpeed = netdev_features_to_bps(current, 0);
> >         counters->ifDirection = (netdev_features_is_full_duplex(current)
> >                                  ? 1 : 2);
> >     } else {
> > diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c
> > index 2fb2fc8..0979f70 100644
> > --- a/ofproto/ofproto.c
> > +++ b/ofproto/ofproto.c
> > @@ -1549,8 +1549,8 @@ ofport_open(const struct ofproto *ofproto,
> >     pp->state = netdev_get_carrier(netdev) ? 0 : OFPUTIL_PS_LINK_DOWN;
> >     netdev_get_features(netdev, &pp->curr, &pp->advertised,
> >                         &pp->supported, &pp->peer);
> > -    pp->curr_speed = netdev_features_to_bps(pp->curr);
> > -    pp->max_speed = netdev_features_to_bps(pp->supported);
> > +    pp->curr_speed = netdev_features_to_bps(pp->curr, 0);
> > +    pp->max_speed = netdev_features_to_bps(pp->supported, 0);
> > 
> >     return netdev;
> > }
> > diff --git a/tests/ofp-print.at b/tests/ofp-print.at
> > index f1fdefb..82846d5 100644
> > --- a/tests/ofp-print.at
> > +++ b/tests/ofp-print.at
> > @@ -142,7 +142,7 @@ actions: OUTPUT SET_VLAN_VID SET_VLAN_PCP STRIP_VLAN 
> > SET_DL_SRC SET_DL_DST SET_N
> >  LOCAL(br0): addr:50:54:00:00:00:01
> >      config:     PORT_DOWN
> >      state:      LINK_DOWN
> > -     speed: 100 Mbps now, 100 Mbps max
> > +     speed: 0 Mbps now, 0 Mbps max
> > ])
> > AT_CLEANUP
> > 
> > diff --git a/tests/ofproto.at b/tests/ofproto.at
> > index 1e5664a..51667e8 100644
> > --- a/tests/ofproto.at
> > +++ b/tests/ofproto.at
> > @@ -17,7 +17,7 @@ actions: OUTPUT SET_VLAN_VID SET_VLAN_PCP STRIP_VLAN 
> > SET_DL_SRC SET_DL_DST SET_N
> >  LOCAL(br0): addr:aa:55:aa:55:00:00
> >      config:     PORT_DOWN
> >      state:      LINK_DOWN
> > -     speed: 100 Mbps now, 100 Mbps max
> > +     speed: 0 Mbps now, 0 Mbps max
> > OFPT_GET_CONFIG_REPLY: frags=normal miss_send_len=0
> > ])
> > OVS_VSWITCHD_STOP
> > @@ -46,7 +46,7 @@ OFPST_PORT_DESC reply:
> >  LOCAL(br0): addr:aa:55:aa:55:00:00
> >      config:     PORT_DOWN
> >      state:      LINK_DOWN
> > -     speed: 100 Mbps now, 100 Mbps max
> > +     speed: 0 Mbps now, 0 Mbps max
> > ])
> > OVS_VSWITCHD_STOP
> > AT_CLEANUP
> > @@ -97,7 +97,7 @@ actions: OUTPUT SET_VLAN_VID SET_VLAN_PCP STRIP_VLAN 
> > SET_DL_SRC SET_DL_DST SET_N
> >  LOCAL(br0): addr:aa:55:aa:55:00:00
> >      config:     $config
> >      state:      $state
> > -     speed: 100 Mbps now, 100 Mbps max
> > +     speed: 0 Mbps now, 0 Mbps max
> > OFPT_GET_CONFIG_REPLY: frags=normal miss_send_len=0
> > ])
> > done
> > @@ -654,7 +654,7 @@ priority:0,metadata:0,in_port:0000,tci(0) 
> > mac(00:26:b9:8c:b0:f9->00:25:83:df:b4:
> >         echo >>expout "OFPT_PORT_STATUS: ADD: 1(test): 
> > addr:aa:55:aa:55:00:0x
> >      config:     PORT_DOWN
> >      state:      LINK_DOWN
> > -     speed: 100 Mbps now, 100 Mbps max"
> > +     speed: 0 Mbps now, 0 Mbps max"
> >     fi
> > 
> >     # OFPT_PORT_STATUS, OFPPR_DELETE
> > @@ -663,7 +663,7 @@ priority:0,metadata:0,in_port:0000,tci(0) 
> > mac(00:26:b9:8c:b0:f9->00:25:83:df:b4:
> >         echo >>expout "OFPT_PORT_STATUS: DEL: 1(test): 
> > addr:aa:55:aa:55:00:0x
> >      config:     PORT_DOWN
> >      state:      LINK_DOWN
> > -     speed: 100 Mbps now, 100 Mbps max"
> > +     speed: 0 Mbps now, 0 Mbps max"
> >     fi
> > 
> >     # OFPT_FLOW_REMOVED, OFPRR_DELETE
> > diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
> > index a481f06..79cd262 100644
> > --- a/vswitchd/bridge.c
> > +++ b/vswitchd/bridge.c
> > @@ -953,16 +953,11 @@ port_configure_stp(const struct ofproto *ofproto, 
> > struct port *port,
> >         port_s->path_cost = strtoul(config_str, NULL, 10);
> >     } else {
> >         enum netdev_features current;
> > +        unsigned int mbps;
> > 
> > -        if (netdev_get_features(iface->netdev, &current, NULL, NULL, 
> > NULL)) {
> > -            /* Couldn't get speed, so assume 100Mb/s. */
> > -            port_s->path_cost = 19;
> > -        } else {
> > -            unsigned int mbps;
> > -
> > -            mbps = netdev_features_to_bps(current) / 1000000;
> > -            port_s->path_cost = stp_convert_speed_to_cost(mbps);
> > -        }
> > +        netdev_get_features(iface->netdev, &current, NULL, NULL, NULL);
> > +        mbps = netdev_features_to_bps(current, 100 * 1000 * 1000) / 
> > 1000000;
> > +        port_s->path_cost = stp_convert_speed_to_cost(mbps);
> >     }
> > 
> >     config_str = smap_get(&port->cfg->other_config, "stp-port-priority");
> > @@ -1654,12 +1649,11 @@ iface_refresh_status(struct iface *iface)
> >     smap_destroy(&smap);
> > 
> >     error = netdev_get_features(iface->netdev, &current, NULL, NULL, NULL);
> > -    if (!error) {
> > +    bps = !error ? netdev_features_to_bps(current, 0) : 0;
> > +    if (bps) {
> >         ovsrec_interface_set_duplex(iface->cfg,
> >                                     netdev_features_is_full_duplex(current)
> >                                     ? "full" : "half");
> > -        /* warning: uint64_t -> int64_t conversion */
> > -        bps = netdev_features_to_bps(current);
> >         ovsrec_interface_set_link_speed(iface->cfg, &bps, 1);
> >     }
> >     else {
> > -- 
> > 1.7.2.5
> > 
> > _______________________________________________
> > dev mailing list
> > dev@openvswitch.org
> > http://openvswitch.org/mailman/listinfo/dev
> 
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to