struct netdev *netdev; /* Network device. */
const char *type; /* Usually same as cfg->type. */
const struct ovsrec_interface *cfg;
+ bool need_refresh; /* Refresh iface after create. */
};
struct mirror {
* has at least one iface, every "struct iface" has a valid ofp_port and
* netdev. */
HMAP_FOR_EACH_SAFE (br, next, node, &all_bridges) {
- if (!br->ofproto && !bridge_add_ofprotos(br)) {
- bridge_destroy(br);
+ if (!br->ofproto) {
+ if (bridge_add_ofprotos(br)) {
+ bridge_del_ofproto_ports(br);
+ } else {
+ bridge_destroy(br);
+ }
}
}
HMAP_FOR_EACH (br, node, &all_bridges) {
}
/* Populate stats columns in new Interface rows. */
- if (iface->netdev && !iface->cfg->mtu) {
+ if (iface->netdev && iface->need_refresh) {
iface_refresh_stats(iface);
iface_refresh_status(iface);
+ iface->need_refresh = false;
}
/* Delete the iface if we failed. */
iface = iface_find(argv[1]);
if (!iface) {
- unixctl_command_reply(conn, 501, "no such interface");
+ unixctl_command_reply_error(conn, "no such interface");
return;
}
if (error) {
ds_put_format(&ds, "failed to dump queues: %s", strerror(error));
}
- unixctl_command_reply(conn, 200, ds_cstr(&ds));
+ unixctl_command_reply(conn, ds_cstr(&ds));
} else {
ds_put_format(&ds, "QoS not configured on %s\n", iface->name);
- unixctl_command_reply(conn, 501, ds_cstr(&ds));
+ unixctl_command_reply_error(conn, ds_cstr(&ds));
}
shash_destroy_free_data(&sh);
br = bridge_lookup(argv[1]);
if (!br) {
- unixctl_command_reply(conn, 501, "Unknown bridge");
+ unixctl_command_reply_error(conn, "Unknown bridge");
return;
}
ds_init(&results);
ofproto_get_all_flows(br->ofproto, &results);
- unixctl_command_reply(conn, 200, ds_cstr(&results));
+ unixctl_command_reply(conn, ds_cstr(&results));
ds_destroy(&results);
}
if (argc > 1) {
br = bridge_lookup(argv[1]);
if (!br) {
- unixctl_command_reply(conn, 501, "Unknown bridge");
+ unixctl_command_reply_error(conn, "Unknown bridge");
return;
}
ofproto_reconnect_controllers(br->ofproto);
ofproto_reconnect_controllers(br->ofproto);
}
}
- unixctl_command_reply(conn, 200, NULL);
+ unixctl_command_reply(conn, NULL);
}
static size_t
oc->band = OFPROTO_OUT_OF_BAND;
oc->rate_limit = 0;
oc->burst_limit = 0;
+ oc->enable_async_msgs = true;
}
/* Converts ovsrec_controller 'c' into an ofproto_controller in 'oc'. */
oc->rate_limit = c->controller_rate_limit ? *c->controller_rate_limit : 0;
oc->burst_limit = (c->controller_burst_limit
? *c->controller_burst_limit : 0);
+ oc->enable_async_msgs = (!c->enable_async_messages
+ || *c->enable_async_messages);
}
/* Configures the IP stack for 'br''s local interface properly according to the
iface->tag = tag_create_random();
iface->netdev = NULL;
iface->cfg = if_cfg;
+ iface->need_refresh = true;
hmap_insert(&br->iface_by_name, &iface->name_node, hash_string(name, 0));
shash_destroy(&details);
}
if (!queue_zero) {
- static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
- VLOG_WARN_RL(&rl, "interface %s: QoS configured without a default "
- "queue (queue 0). Packets not directed to a "
- "correctly configured queue may be dropped.",
- iface->name);
+ shash_init(&details);
+ netdev_set_queue(iface->netdev, 0, &details);
+ shash_destroy(&details);
}
}