iface-to-br IFACE print name of bridge that contains IFACE\n\
\n\
Controller commands:\n\
- get-controller [BRIDGE] print the controller for BRIDGE\n\
- del-controller [BRIDGE] delete the controller for BRIDGE\n\
- set-controller [BRIDGE] TARGET set the controller for BRIDGE to TARGET\n\
- get-fail-mode [BRIDGE] print the fail-mode for BRIDGE\n\
- del-fail-mode [BRIDGE] delete the fail-mode for BRIDGE\n\
- set-fail-mode [BRIDGE] MODE set the fail-mode for BRIDGE to MODE\n\
+ get-controller BRIDGE print the controller for BRIDGE\n\
+ del-controller BRIDGE delete the controller for BRIDGE\n\
+ set-controller BRIDGE TARGET set the controller for BRIDGE to TARGET\n\
+ get-fail-mode BRIDGE print the fail-mode for BRIDGE\n\
+ del-fail-mode BRIDGE delete the fail-mode for BRIDGE\n\
+ set-fail-mode BRIDGE MODE set the fail-mode for BRIDGE to MODE\n\
\n\
SSL commands:\n\
get-ssl print the SSL configuration\n\
struct shash bridges;
struct shash ports;
struct shash ifaces;
- struct ovsrec_controller **ctrl;
- size_t n_ctrl;
};
static char *
shash_init(&info->ports);
shash_init(&info->ifaces);
- info->ctrl = ovs->controller;
- info->n_ctrl = ovs->n_controller;
-
shash_init(&bridges);
shash_init(&ports);
for (i = 0; i < ovs->n_bridges; i++) {
/* Reset the Open_vSwitch table. */
ovsrec_open_vswitch_set_managers(ctx->ovs, NULL, 0);
- ovsrec_open_vswitch_set_controller(ctx->ovs, NULL, 0);
ovsrec_open_vswitch_set_ssl(ctx->ovs, NULL);
OVSREC_BRIDGE_FOR_EACH (br, idl) {
free_info(&info);
}
-/* Print targets of the 'n_controllers' in 'controllers' on the output for
- * 'ctx'. */
static void
-print_controllers(struct vsctl_context *ctx,
- struct ovsrec_controller **controllers,
- size_t n_controllers)
+cmd_get_controller(struct vsctl_context *ctx)
{
- /* Print the targets in sorted order for reproducibility. */
+ struct vsctl_info info;
+ struct vsctl_bridge *br;
struct svec targets;
size_t i;
+ get_info(ctx->ovs, &info);
+ br = find_bridge(&info, ctx->argv[1], true);
+
+ /* Print the targets in sorted order for reproducibility. */
svec_init(&targets);
- for (i = 0; i < n_controllers; i++) {
- svec_add(&targets, controllers[i]->target);
+ for (i = 0; i < br->n_ctrl; i++) {
+ svec_add(&targets, br->ctrl[i]->target);
}
svec_sort(&targets);
ds_put_format(&ctx->output, "%s\n", targets.names[i]);
}
svec_destroy(&targets);
-}
-
-static void
-cmd_get_controller(struct vsctl_context *ctx)
-{
- struct vsctl_info info;
-
- get_info(ctx->ovs, &info);
-
- if (ctx->argc == 1 || !strcmp(ctx->argv[1], "default")) {
- print_controllers(ctx, info.ctrl, info.n_ctrl);
- } else {
- struct vsctl_bridge *br = find_bridge(&info, ctx->argv[1], true);
- if (br->n_ctrl) {
- print_controllers(ctx, br->ctrl, br->n_ctrl);
- } else {
- print_controllers(ctx, info.ctrl, info.n_ctrl);
- }
- }
free_info(&info);
}
cmd_del_controller(struct vsctl_context *ctx)
{
struct vsctl_info info;
+ struct vsctl_bridge *br;
get_info(ctx->ovs, &info);
+ br = find_real_bridge(&info, ctx->argv[1], true);
- if (ctx->argc == 1 || !strcmp(ctx->argv[1], "default")) {
- if (info.n_ctrl) {
- delete_controllers(info.ctrl, info.n_ctrl);
- ovsrec_open_vswitch_set_controller(ctx->ovs, NULL, 0);
- }
- } else {
- struct vsctl_bridge *br = find_real_bridge(&info, ctx->argv[1], true);
- if (br->ctrl) {
- delete_controllers(br->ctrl, br->n_ctrl);
- ovsrec_bridge_set_controller(br->br_cfg, NULL, 0);
- }
+ if (br->ctrl) {
+ delete_controllers(br->ctrl, br->n_ctrl);
+ ovsrec_bridge_set_controller(br->br_cfg, NULL, 0);
}
free_info(&info);
return controllers;
}
-static void
-set_default_controllers(struct vsctl_context *ctx, char *targets[], size_t n)
-{
- struct ovsrec_controller **controllers;
-
- delete_controllers(ctx->ovs->controller, ctx->ovs->n_controller);
-
- controllers = insert_controllers(ctx->txn, targets, n);
- ovsrec_open_vswitch_set_controller(ctx->ovs, controllers, n);
- free(controllers);
-}
-
static void
cmd_set_controller(struct vsctl_context *ctx)
{
struct vsctl_info info;
+ struct vsctl_bridge *br;
+ struct ovsrec_controller **controllers;
+ size_t n;
get_info(ctx->ovs, &info);
+ br = find_real_bridge(&info, ctx->argv[1], true);
- if (ctx->argc == 2) {
- /* Set one controller in the "Open_vSwitch" table. */
- set_default_controllers(ctx, &ctx->argv[1], 1);
- } else if (!strcmp(ctx->argv[1], "default")) {
- /* Set one or more controllers in the "Open_vSwitch" table. */
- set_default_controllers(ctx, &ctx->argv[2], ctx->argc - 2);
- } else {
- /* Set one or more controllers for a particular bridge. */
- struct vsctl_bridge *br = find_real_bridge(&info, ctx->argv[1], true);
- struct ovsrec_controller **controllers;
- size_t n;
-
- delete_controllers(br->ctrl, br->n_ctrl);
+ delete_controllers(br->ctrl, br->n_ctrl);
- n = ctx->argc - 2;
- controllers = insert_controllers(ctx->txn, &ctx->argv[2], n);
- ovsrec_bridge_set_controller(br->br_cfg, controllers, n);
- free(controllers);
- }
+ n = ctx->argc - 2;
+ controllers = insert_controllers(ctx->txn, &ctx->argv[2], n);
+ ovsrec_bridge_set_controller(br->br_cfg, controllers, n);
+ free(controllers);
free_info(&info);
}
cmd_get_fail_mode(struct vsctl_context *ctx)
{
struct vsctl_info info;
+ struct vsctl_bridge *br;
const char *fail_mode = NULL;
get_info(ctx->ovs, &info);
+ br = find_bridge(&info, ctx->argv[1], true);
- if (ctx->argc == 1 || !strcmp(ctx->argv[1], "default")) {
- /* Return the fail-mode from the "Open_vSwitch" table */
- fail_mode = get_fail_mode(info.ctrl, info.n_ctrl);
- } else {
- /* Return the fail-mode for a particular bridge. */
- struct vsctl_bridge *br = find_bridge(&info, ctx->argv[1], true);
-
- /* If no controller is defined for the requested bridge, fallback to
- * the "Open_vSwitch" table's controller. */
- fail_mode = (br->n_ctrl
- ? get_fail_mode(br->ctrl, br->n_ctrl)
- : get_fail_mode(info.ctrl, info.n_ctrl));
- }
+ fail_mode = get_fail_mode(br->ctrl, br->n_ctrl);
if (fail_mode && strlen(fail_mode)) {
ds_put_format(&ctx->output, "%s\n", fail_mode);
cmd_del_fail_mode(struct vsctl_context *ctx)
{
struct vsctl_info info;
+ struct vsctl_bridge *br;
get_info(ctx->ovs, &info);
+ br = find_real_bridge(&info, ctx->argv[1], true);
- if (ctx->argc == 1 || !strcmp(ctx->argv[1], "default")) {
- set_fail_mode(info.ctrl, info.n_ctrl, NULL);
- } else {
- struct vsctl_bridge *br = find_real_bridge(&info, ctx->argv[1], true);
-
- set_fail_mode(br->ctrl, br->n_ctrl, NULL);
- }
+ set_fail_mode(br->ctrl, br->n_ctrl, NULL);
free_info(&info);
}
cmd_set_fail_mode(struct vsctl_context *ctx)
{
struct vsctl_info info;
- const char *bridge;
- const char *fail_mode;
+ struct vsctl_bridge *br;
+ const char *fail_mode = ctx->argv[2];
get_info(ctx->ovs, &info);
-
- if (ctx->argc == 2) {
- bridge = "default";
- fail_mode = ctx->argv[1];
- } else {
- bridge = ctx->argv[1];
- fail_mode = ctx->argv[2];
- }
+ br = find_real_bridge(&info, ctx->argv[1], true);
if (strcmp(fail_mode, "standalone") && strcmp(fail_mode, "secure")) {
vsctl_fatal("fail-mode must be \"standalone\" or \"secure\"");
}
- if (!strcmp(bridge, "default")) {
- /* Set the fail-mode in the "Open_vSwitch" table. */
- if (!info.ctrl) {
- vsctl_fatal("no controller declared");
- }
- set_fail_mode(info.ctrl, info.n_ctrl, fail_mode);
- } else {
- struct vsctl_bridge *br = find_real_bridge(&info, bridge, true);
-
- if (!br->ctrl) {
- vsctl_fatal("no controller declared for %s", br->name);
- }
- set_fail_mode(br->ctrl, br->n_ctrl, fail_mode);
+ if (!br->ctrl) {
+ vsctl_fatal("no controller declared for %s", br->name);
}
+ set_fail_mode(br->ctrl, br->n_ctrl, fail_mode);
free_info(&info);
}
{&ovsrec_table_controller,
{{&ovsrec_table_bridge,
&ovsrec_bridge_col_name,
- &ovsrec_bridge_col_controller},
- {&ovsrec_table_open_vswitch,
- NULL,
- &ovsrec_open_vswitch_col_controller}}},
+ &ovsrec_bridge_col_controller}}},
{&ovsrec_table_interface,
{{&ovsrec_table_interface, &ovsrec_interface_col_name, NULL},
{"iface-to-br", 1, 1, cmd_iface_to_br, NULL, ""},
/* Controller commands. */
- {"get-controller", 0, 1, cmd_get_controller, NULL, ""},
- {"del-controller", 0, 1, cmd_del_controller, NULL, ""},
+ {"get-controller", 1, 1, cmd_get_controller, NULL, ""},
+ {"del-controller", 1, 1, cmd_del_controller, NULL, ""},
{"set-controller", 1, INT_MAX, cmd_set_controller, NULL, ""},
- {"get-fail-mode", 0, 1, cmd_get_fail_mode, NULL, ""},
- {"del-fail-mode", 0, 1, cmd_del_fail_mode, NULL, ""},
- {"set-fail-mode", 1, 2, cmd_set_fail_mode, NULL, ""},
+ {"get-fail-mode", 1, 1, cmd_get_fail_mode, NULL, ""},
+ {"del-fail-mode", 1, 1, cmd_del_fail_mode, NULL, ""},
+ {"set-fail-mode", 2, 2, cmd_set_fail_mode, NULL, ""},
/* SSL commands. */
{"get-ssl", 0, 0, cmd_get_ssl, NULL, ""},
static unixctl_cb_func bridge_unixctl_dump_flows;
static unixctl_cb_func bridge_unixctl_reconnect;
static int bridge_run_one(struct bridge *);
-static size_t bridge_get_controllers(const struct ovsrec_open_vswitch *ovs_cfg,
- const struct bridge *br,
+static size_t bridge_get_controllers(const struct bridge *br,
struct ovsrec_controller ***controllersp);
-static void bridge_reconfigure_one(const struct ovsrec_open_vswitch *,
- struct bridge *);
-static void bridge_reconfigure_remotes(const struct ovsrec_open_vswitch *,
- struct bridge *,
+static void bridge_reconfigure_one(struct bridge *);
+static void bridge_reconfigure_remotes(struct bridge *,
const struct sockaddr_in *managers,
size_t n_managers);
static void bridge_get_all_ifaces(const struct bridge *, struct shash *ifaces);
/* Reconfigure all bridges. */
LIST_FOR_EACH (br, struct bridge, node, &all_bridges) {
- bridge_reconfigure_one(ovs_cfg, br);
+ bridge_reconfigure_one(br);
}
/* Add and delete ports on all datapaths.
oso.agent_device = sflow_cfg->agent;
oso.control_ip = NULL;
- n_controllers = bridge_get_controllers(ovs_cfg, br, &controllers);
+ n_controllers = bridge_get_controllers(br, &controllers);
for (i = 0; i < n_controllers; i++) {
if (controllers[i]->local_ip) {
oso.control_ip = controllers[i]->local_ip;
* yet; when a controller is configured, resetting the datapath ID will
* immediately disconnect from the controller, so it's better to set
* the datapath ID before the controller. */
- bridge_reconfigure_remotes(ovs_cfg, br, managers, n_managers);
+ bridge_reconfigure_remotes(br, managers, n_managers);
}
LIST_FOR_EACH (br, struct bridge, node, &all_bridges) {
for (i = 0; i < br->n_ports; i++) {
}
static size_t
-bridge_get_controllers(const struct ovsrec_open_vswitch *ovs_cfg,
- const struct bridge *br,
+bridge_get_controllers(const struct bridge *br,
struct ovsrec_controller ***controllersp)
{
struct ovsrec_controller **controllers;
size_t n_controllers;
- if (br->cfg->n_controller) {
- controllers = br->cfg->controller;
- n_controllers = br->cfg->n_controller;
- } else {
- controllers = ovs_cfg->controller;
- n_controllers = ovs_cfg->n_controller;
- }
+ controllers = br->cfg->controller;
+ n_controllers = br->cfg->n_controller;
if (n_controllers == 1 && !strcmp(controllers[0]->target, "none")) {
controllers = NULL;
}
static void
-bridge_reconfigure_one(const struct ovsrec_open_vswitch *ovs_cfg,
- struct bridge *br)
+bridge_reconfigure_one(struct bridge *br)
{
struct shash old_ports, new_ports;
struct svec listeners, old_listeners;
* user didn't specify one.
*
* XXX perhaps we should synthesize a port ourselves in this case. */
- if (bridge_get_controllers(ovs_cfg, br, NULL)) {
+ if (bridge_get_controllers(br, NULL)) {
char local_name[IF_NAMESIZE];
int error;
}
static void
-bridge_reconfigure_remotes(const struct ovsrec_open_vswitch *ovs_cfg,
- struct bridge *br,
+bridge_reconfigure_remotes(struct bridge *br,
const struct sockaddr_in *managers,
size_t n_managers)
{
ofproto_set_extra_in_band_remotes(br->ofproto, managers, n_managers);
- n_controllers = bridge_get_controllers(ovs_cfg, br, &controllers);
+ n_controllers = bridge_get_controllers(br, &controllers);
if (ofproto_has_controller(br->ofproto) != (n_controllers != 0)) {
ofproto_flush_flows(br->ofproto);
}