@@ -2763,18 +2763,14 @@ egress_policer_qos_construct(struct netdev *netdev,
{
struct netdev_dpdk *dev = netdev_dpdk_cast(netdev);
struct egress_policer *policer;
- const char *cir_s;
- const char *cbs_s;
int err = 0;
rte_spinlock_lock(&dev->qos_lock);
policer = xmalloc(sizeof *policer);
qos_conf_init(&policer->qos_conf, &egress_policer_ops);
dev->qos_conf = &policer->qos_conf;
- cir_s = smap_get(details, "cir");
- cbs_s = smap_get(details, "cbs");
- policer->app_srtcm_params.cir = cir_s ? strtoull(cir_s, NULL, 10) : 0;
- policer->app_srtcm_params.cbs = cbs_s ? strtoull(cbs_s, NULL, 10) : 0;
+ policer->app_srtcm_params.cir = smap_get_ullong(details, "cir", 0);
+ policer->app_srtcm_params.cbs = smap_get_ullong(details, "cbs", 0);
policer->app_srtcm_params.ebs = 0;
err = rte_meter_srtcm_config(&policer->egress_meter,
&policer->app_srtcm_params);
@@ -2808,15 +2804,11 @@ static int
egress_policer_qos_set(struct netdev *netdev, const struct smap *details)
{
struct egress_policer *policer;
- const char *cir_s;
- const char *cbs_s;
int err = 0;
policer = egress_policer_get__(netdev);
- cir_s = smap_get(details, "cir");
- cbs_s = smap_get(details, "cbs");
- policer->app_srtcm_params.cir = cir_s ? strtoull(cir_s, NULL, 10) : 0;
- policer->app_srtcm_params.cbs = cbs_s ? strtoull(cbs_s, NULL, 10) : 0;
+ policer->app_srtcm_params.cir = smap_get_ullong(details, "cir", 0);
+ policer->app_srtcm_params.cbs = smap_get_ullong(details, "cbs", 0);
policer->app_srtcm_params.ebs = 0;
err = rte_meter_srtcm_config(&policer->egress_meter,
&policer->app_srtcm_params);
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2015 Nicira, Inc.
+ * Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Nicira, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -2937,17 +2937,9 @@ static void
codel_parse_qdisc_details__(struct netdev *netdev OVS_UNUSED,
const struct smap *details, struct codel *codel)
{
- const char *target_s;
- const char *limit_s;
- const char *interval_s;
-
- target_s = smap_get(details, "target");
- limit_s = smap_get(details, "limit");
- interval_s = smap_get(details, "interval");
-
- codel->target = target_s ? strtoull(target_s, NULL, 10) : 0;
- codel->limit = limit_s ? strtoull(limit_s, NULL, 10) : 0;
- codel->interval = interval_s ? strtoull(interval_s, NULL, 10) : 0;
+ codel->target = smap_get_ullong(details, "target", 0);
+ codel->limit = smap_get_ullong(details, "limit", 0);
+ codel->interval = smap_get_ullong(details, "interval", 0);
if (!codel->target) {
codel->target = 5000;
@@ -3168,22 +3160,12 @@ static void
fqcodel_parse_qdisc_details__(struct netdev *netdev OVS_UNUSED,
const struct smap *details, struct fqcodel *fqcodel)
{
- const char *target_s;
- const char *limit_s;
- const char *interval_s;
- const char *flows_s;
- const char *quantum_s;
-
- target_s = smap_get(details, "target");
- limit_s = smap_get(details, "limit");
- interval_s = smap_get(details, "interval");
- flows_s = smap_get(details, "flows");
- quantum_s = smap_get(details, "quantum");
- fqcodel->target = target_s ? strtoull(target_s, NULL, 10) : 0;
- fqcodel->limit = limit_s ? strtoull(limit_s, NULL, 10) : 0;
- 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;
+ fqcodel->target = smap_get_ullong(details, "target", 0);
+ fqcodel->limit = smap_get_ullong(details, "limit", 0);
+ fqcodel->interval = smap_get_ullong(details, "interval", 0);
+ fqcodel->flows = smap_get_ullong(details, "flows", 0);
+ fqcodel->quantum = smap_get_ullong(details, "quantum", 0);
+
if (!fqcodel->target) {
fqcodel->target = 5000;
}
@@ -3404,27 +3386,20 @@ static void
sfq_parse_qdisc_details__(struct netdev *netdev,
const struct smap *details, struct sfq *sfq)
{
- const char *perturb_s;
- const char *quantum_s;
- int mtu;
- int mtu_error;
+ sfq->perturb = smap_get_ullong(details, "perturb", 0);
+ sfq->quantum = smap_get_ullong(details, "quantum", 0);
- perturb_s = smap_get(details, "perturb");
- quantum_s = smap_get(details, "quantum");
- sfq->perturb = perturb_s ? strtoull(perturb_s, NULL, 10) : 0;
- sfq->quantum = quantum_s ? strtoull(quantum_s, NULL, 10) : 0;
if (!sfq->perturb) {
sfq->perturb = 10;
}
if (!sfq->quantum) {
- mtu_error = netdev_linux_get_mtu__(netdev_linux_cast(netdev), &mtu);
- if (!mtu_error) {
+ int mtu;
+ if (!netdev_linux_get_mtu__(netdev_linux_cast(netdev), &mtu)) {
sfq->quantum = mtu;
} else {
VLOG_WARN_RL(&rl, "when using SFQ, you must specify quantum on a "
"device without mtu");
- return;
}
}
}
@@ -3697,10 +3672,8 @@ htb_parse_qdisc_details__(struct netdev *netdev_,
const struct smap *details, struct htb_class *hc)
{
struct netdev_linux *netdev = netdev_linux_cast(netdev_);
- const char *max_rate_s;
- max_rate_s = smap_get(details, "max-rate");
- hc->max_rate = max_rate_s ? strtoull(max_rate_s, NULL, 10) / 8 : 0;
+ hc->max_rate = smap_get_ullong(details, "max-rate", 0) / 8;
if (!hc->max_rate) {
enum netdev_features current;
@@ -3718,10 +3691,6 @@ htb_parse_class_details__(struct netdev *netdev,
const struct smap *details, struct htb_class *hc)
{
const struct htb *htb = htb_get__(netdev);
- const char *min_rate_s = smap_get(details, "min-rate");
- const char *max_rate_s = smap_get(details, "max-rate");
- const char *burst_s = smap_get(details, "burst");
- const char *priority_s = smap_get(details, "priority");
int mtu, error;
error = netdev_linux_get_mtu__(netdev_linux_cast(netdev), &mtu);
@@ -3733,14 +3702,15 @@ htb_parse_class_details__(struct netdev *netdev,
/* HTB requires at least an mtu sized min-rate to send any traffic even
* on uncongested links. */
- hc->min_rate = min_rate_s ? strtoull(min_rate_s, NULL, 10) / 8 : 0;
+ hc->min_rate = smap_get_ullong(details, "min-rate", 0) / 8;
hc->min_rate = MAX(hc->min_rate, mtu);
hc->min_rate = MIN(hc->min_rate, htb->max_rate);
/* max-rate */
- hc->max_rate = (max_rate_s
- ? strtoull(max_rate_s, NULL, 10) / 8
- : htb->max_rate);
+ hc->max_rate = smap_get_ullong(details, "max-rate", 0) / 8;
+ if (!hc->max_rate) {
+ hc->max_rate = htb->max_rate;
+ }
hc->max_rate = MAX(hc->max_rate, hc->min_rate);
hc->max_rate = MIN(hc->max_rate, htb->max_rate);
@@ -3753,11 +3723,11 @@ htb_parse_class_details__(struct netdev *netdev,
* doesn't include the Ethernet header, we need to add at least 14 (18?) to
* the MTU. We actually add 64, instead of 14, as a guard against
* additional headers get tacked on somewhere that we're not aware of. */
- hc->burst = burst_s ? strtoull(burst_s, NULL, 10) / 8 : 0;
+ hc->burst = smap_get_ullong(details, "burst", 0) / 8;
hc->burst = MAX(hc->burst, mtu + 64);
/* priority */
- hc->priority = priority_s ? strtoul(priority_s, NULL, 10) : 0;
+ hc->priority = smap_get_ullong(details, "priority", 0);
return 0;
}
@@ -4175,12 +4145,8 @@ hfsc_parse_qdisc_details__(struct netdev *netdev_, const struct smap *details,
struct hfsc_class *class)
{
struct netdev_linux *netdev = netdev_linux_cast(netdev_);
- uint32_t max_rate;
- const char *max_rate_s;
-
- max_rate_s = smap_get(details, "max-rate");
- max_rate = max_rate_s ? strtoull(max_rate_s, NULL, 10) / 8 : 0;
+ uint32_t max_rate = smap_get_ullong(details, "max-rate", 0) / 8;
if (!max_rate) {
enum netdev_features current;
@@ -4200,19 +4166,14 @@ hfsc_parse_class_details__(struct netdev *netdev,
{
const struct hfsc *hfsc;
uint32_t min_rate, max_rate;
- const char *min_rate_s, *max_rate_s;
hfsc = hfsc_get__(netdev);
- min_rate_s = smap_get(details, "min-rate");
- max_rate_s = smap_get(details, "max-rate");
- min_rate = min_rate_s ? strtoull(min_rate_s, NULL, 10) / 8 : 0;
+ min_rate = smap_get_ullong(details, "min-rate", 0) / 8;
min_rate = MAX(min_rate, 1);
min_rate = MIN(min_rate, hfsc->max_rate);
- max_rate = (max_rate_s
- ? strtoull(max_rate_s, NULL, 10) / 8
- : hfsc->max_rate);
+ max_rate = smap_get_ullong(details, "max-rate", hfsc->max_rate * 8) / 8;
max_rate = MAX(max_rate, min_rate);
max_rate = MIN(max_rate, hfsc->max_rate);
@@ -231,6 +231,17 @@ smap_get_int(const struct smap *smap, const char *key, int def)
return value ? atoi(value) : def;
}
+/* Gets the value associated with 'key' in 'smap' and converts it to an int
+ * using strtoull(). If 'key' is not in 'smap', returns 'def'. */
+unsigned long long int
+smap_get_ullong(const struct smap *smap, const char *key,
+ unsigned long long def)
+{
+ const char *value = smap_get(smap, key);
+
+ return value ? strtoull(value, NULL, 10) : def;
+}
+
/* Gets the value associated with 'key' in 'smap' and converts it to a UUID
* using uuid_from_string(). Returns true if successful, false if 'key' is not
* in 'smap' or if 'key' does not have the correct syntax for a UUID. */
@@ -88,6 +88,8 @@ const char *smap_get_def(const struct smap *, const char *key,
struct smap_node *smap_get_node(const struct smap *, const char *);
bool smap_get_bool(const struct smap *smap, const char *key, bool def);
int smap_get_int(const struct smap *smap, const char *key, int def);
+unsigned long long int smap_get_ullong(const struct smap *, const char *key,
+ unsigned long long def);
bool smap_get_uuid(const struct smap *, const char *key, struct uuid *);
bool smap_is_empty(const struct smap *);
@@ -1430,12 +1430,9 @@ port_configure_rstp(const struct ofproto *ofproto, struct port *port,
port_s->priority = RSTP_DEFAULT_PORT_PRIORITY;
}
- config_str = smap_get(&port->cfg->other_config, "rstp-admin-p2p-mac");
- if (config_str) {
- port_s->admin_p2p_mac_state = strtoul(config_str, NULL, 0);
- } else {
- port_s->admin_p2p_mac_state = RSTP_ADMIN_P2P_MAC_FORCE_TRUE;
- }
+ port_s->admin_p2p_mac_state = smap_get_ullong(
+ &port->cfg->other_config, "rstp-admin-p2p-mac",
+ RSTP_ADMIN_P2P_MAC_FORCE_TRUE);
port_s->admin_port_state = smap_get_bool(&port->cfg->other_config,
"rstp-admin-port-state", true);
@@ -1476,33 +1473,17 @@ bridge_configure_stp(struct bridge *br, bool enable_stp)
br_s.system_id = eth_addr_to_uint64(br->ea);
}
- config_str = smap_get(&br->cfg->other_config, "stp-priority");
- if (config_str) {
- br_s.priority = strtoul(config_str, NULL, 0);
- } else {
- br_s.priority = STP_DEFAULT_BRIDGE_PRIORITY;
- }
+ br_s.priority = smap_get_ullong(&br->cfg->other_config, "stp-priority",
+ STP_DEFAULT_BRIDGE_PRIORITY);
+ br_s.hello_time = smap_get_ullong(&br->cfg->other_config,
+ "stp-hello-time",
+ STP_DEFAULT_HELLO_TIME);
- config_str = smap_get(&br->cfg->other_config, "stp-hello-time");
- if (config_str) {
- br_s.hello_time = strtoul(config_str, NULL, 10) * 1000;
- } else {
- br_s.hello_time = STP_DEFAULT_HELLO_TIME;
- }
-
- config_str = smap_get(&br->cfg->other_config, "stp-max-age");
- if (config_str) {
- br_s.max_age = strtoul(config_str, NULL, 10) * 1000;
- } else {
- br_s.max_age = STP_DEFAULT_MAX_AGE;
- }
-
- config_str = smap_get(&br->cfg->other_config, "stp-forward-delay");
- if (config_str) {
- br_s.fwd_delay = strtoul(config_str, NULL, 10) * 1000;
- } else {
- br_s.fwd_delay = STP_DEFAULT_FWD_DELAY;
- }
+ br_s.max_age = smap_get_ullong(&br->cfg->other_config, "stp-max-age",
+ STP_DEFAULT_HELLO_TIME / 1000) * 1000;
+ br_s.fwd_delay = smap_get_ullong(&br->cfg->other_config,
+ "stp-forward-delay",
+ STP_DEFAULT_FWD_DELAY / 1000) * 1000;
/* Configure STP on the bridge. */
if (ofproto_set_stp(br->ofproto, &br_s)) {
@@ -1571,49 +1552,19 @@ bridge_configure_rstp(struct bridge *br, bool enable_rstp)
br_s.address = eth_addr_to_uint64(br->ea);
}
- config_str = smap_get(&br->cfg->other_config, "rstp-priority");
- if (config_str) {
- br_s.priority = strtoul(config_str, NULL, 0);
- } else {
- br_s.priority = RSTP_DEFAULT_PRIORITY;
- }
-
- config_str = smap_get(&br->cfg->other_config, "rstp-ageing-time");
- if (config_str) {
- br_s.ageing_time = strtoul(config_str, NULL, 0);
- } else {
- br_s.ageing_time = RSTP_DEFAULT_AGEING_TIME;
- }
-
- config_str = smap_get(&br->cfg->other_config,
- "rstp-force-protocol-version");
- if (config_str) {
- br_s.force_protocol_version = strtoul(config_str, NULL, 0);
- } else {
- br_s.force_protocol_version = FPV_DEFAULT;
- }
-
- config_str = smap_get(&br->cfg->other_config, "rstp-max-age");
- if (config_str) {
- br_s.bridge_max_age = strtoul(config_str, NULL, 10);
- } else {
- br_s.bridge_max_age = RSTP_DEFAULT_BRIDGE_MAX_AGE;
- }
-
- config_str = smap_get(&br->cfg->other_config, "rstp-forward-delay");
- if (config_str) {
- br_s.bridge_forward_delay = strtoul(config_str, NULL, 10);
- } else {
- br_s.bridge_forward_delay = RSTP_DEFAULT_BRIDGE_FORWARD_DELAY;
- }
-
- config_str = smap_get(&br->cfg->other_config,
- "rstp-transmit-hold-count");
- if (config_str) {
- br_s.transmit_hold_count = strtoul(config_str, NULL, 10);
- } else {
- br_s.transmit_hold_count = RSTP_DEFAULT_TRANSMIT_HOLD_COUNT;
- }
+ const struct smap *oc = &br->cfg->other_config;
+ br_s.priority = smap_get_ullong(oc, "rstp-priority",
+ RSTP_DEFAULT_PRIORITY);
+ br_s.ageing_time = smap_get_ullong(oc, "rstp-ageing-time",
+ RSTP_DEFAULT_AGEING_TIME);
+ br_s.force_protocol_version = smap_get_ullong(
+ oc, "rstp-force-protocol-version", FPV_DEFAULT);
+ br_s.bridge_max_age = smap_get_ullong(oc, "rstp-max-age",
+ RSTP_DEFAULT_BRIDGE_MAX_AGE);
+ br_s.bridge_forward_delay = smap_get_ullong(
+ oc, "rstp-forward-delay", RSTP_DEFAULT_BRIDGE_FORWARD_DELAY);
+ br_s.transmit_hold_count = smap_get_ullong(
+ oc, "rstp-transmit-hold-count", RSTP_DEFAULT_TRANSMIT_HOLD_COUNT);
/* Configure RSTP on the bridge. */
if (ofproto_set_rstp(br->ofproto, &br_s)) {
@@ -1876,21 +1827,16 @@ bridge_configure_forward_bpdu(struct bridge *br)
static void
bridge_configure_mac_table(struct bridge *br)
{
- const char *idle_time_str;
- int idle_time;
-
- const char *mac_table_size_str;
- int mac_table_size;
-
- idle_time_str = smap_get(&br->cfg->other_config, "mac-aging-time");
- idle_time = (idle_time_str && atoi(idle_time_str)
- ? atoi(idle_time_str)
- : MAC_ENTRY_DEFAULT_IDLE_TIME);
+ const struct smap *oc = &br->cfg->other_config;
+ int idle_time = smap_get_int(oc, "mac-aging-time", 0);
+ if (!idle_time) {
+ idle_time = MAC_ENTRY_DEFAULT_IDLE_TIME;
+ }
- mac_table_size_str = smap_get(&br->cfg->other_config, "mac-table-size");
- mac_table_size = (mac_table_size_str && atoi(mac_table_size_str)
- ? atoi(mac_table_size_str)
- : MAC_DEFAULT_MAX);
+ int mac_table_size = smap_get_int(oc, "mac-table-size", 0);
+ if (!mac_table_size) {
+ mac_table_size = MAC_DEFAULT_MAX;
+ }
ofproto_set_mac_table_config(br->ofproto, idle_time, mac_table_size);
}
@@ -1904,24 +1850,17 @@ bridge_configure_mcast_snooping(struct bridge *br)
} else {
struct port *port;
struct ofproto_mcast_snooping_settings br_s;
- const char *idle_time_str;
- const char *max_entries_str;
-
- idle_time_str = smap_get(&br->cfg->other_config,
- "mcast-snooping-aging-time");
- br_s.idle_time = (idle_time_str && atoi(idle_time_str)
- ? atoi(idle_time_str)
- : MCAST_ENTRY_DEFAULT_IDLE_TIME);
-
- max_entries_str = smap_get(&br->cfg->other_config,
- "mcast-snooping-table-size");
- br_s.max_entries = (max_entries_str && atoi(max_entries_str)
- ? atoi(max_entries_str)
+
+ const struct smap *oc = &br->cfg->other_config;
+ int idle_time = smap_get_int(oc, "mcast-snooping-aging-time", 0);
+ br_s.idle_time = idle_time ? idle_time : MCAST_ENTRY_DEFAULT_IDLE_TIME;
+ int max_entries = smap_get_int(oc, "mcast-snooping-table-size", 0);
+ br_s.max_entries = (max_entries
+ ? max_entries
: MCAST_DEFAULT_MAX_ENTRIES);
- br_s.flood_unreg = !smap_get_bool(&br->cfg->other_config,
- "mcast-snooping-disable-flood-unregistered",
- false);
+ br_s.flood_unreg = !smap_get_bool(
+ oc, "mcast-snooping-disable-flood-unregistered", false);
/* Configure multicast snooping on the bridge */
if (ofproto_set_mcast_snooping(br->ofproto, &br_s)) {
@@ -2055,12 +1994,11 @@ static void
bridge_pick_local_hw_addr(struct bridge *br, struct eth_addr *ea,
struct iface **hw_addr_iface)
{
- const char *hwaddr;
*hw_addr_iface = NULL;
/* Did the user request a particular MAC? */
- hwaddr = smap_get(&br->cfg->other_config, "hwaddr");
- if (hwaddr && eth_addr_from_string(hwaddr, ea)) {
+ const char *hwaddr = smap_get_def(&br->cfg->other_config, "hwaddr", "");
+ if (eth_addr_from_string(hwaddr, ea)) {
if (eth_addr_is_multicast(*ea)) {
VLOG_ERR("bridge %s: cannot set MAC address to multicast "
"address "ETH_ADDR_FMT, br->name, ETH_ADDR_ARGS(*ea));
@@ -2100,8 +2038,8 @@ bridge_pick_datapath_id(struct bridge *br,
const char *datapath_id;
uint64_t dpid;
- datapath_id = smap_get(&br->cfg->other_config, "datapath-id");
- if (datapath_id && dpid_from_string(datapath_id, &dpid)) {
+ datapath_id = smap_get_def(&br->cfg->other_config, "datapath-id", "");
+ if (dpid_from_string(datapath_id, &dpid)) {
return dpid;
}
@@ -4152,8 +4090,8 @@ port_configure_lacp(struct port *port, struct lacp_settings *s)
? priority
: UINT16_MAX - !ovs_list_is_short(&port->ifaces));
- lacp_time = smap_get(&port->cfg->other_config, "lacp-time");
- s->fast = lacp_time && !strcasecmp(lacp_time, "fast");
+ lacp_time = smap_get_def(&port->cfg->other_config, "lacp-time", "");
+ s->fast = !strcasecmp(lacp_time, "fast");
s->fallback_ab_cfg = smap_get_bool(&port->cfg->other_config,
"lacp-fallback-ab", false);
Signed-off-by: Ben Pfaff <blp@ovn.org> --- lib/netdev-dpdk.c | 16 ++---- lib/netdev-linux.c | 89 +++++++++-------------------- lib/smap.c | 11 ++++ lib/smap.h | 2 + vswitchd/bridge.c | 162 +++++++++++++++++------------------------------------ 5 files changed, 92 insertions(+), 188 deletions(-)