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, ¤t, 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, ¤t, 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, ¤t, 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, ¤t, 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, ¤t, 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, ¤t, 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