There's currently no way to set the admin state on dummy netdevs. This patch provides a mechanism to do so that generalizes to all netdevs cleanly.
Signed-off-by: Ethan Jackson <et...@nicira.com> --- vswitchd/bridge.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c index 2c1142b..69304bb 100644 --- a/vswitchd/bridge.c +++ b/vswitchd/bridge.c @@ -177,6 +177,8 @@ static void bridge_destroy(struct bridge *); static struct bridge *bridge_lookup(const char *name); static unixctl_cb_func bridge_unixctl_dump_flows; static unixctl_cb_func bridge_unixctl_reconnect; +static unixctl_cb_func iface_unixctl_set_admin_state; + static size_t bridge_get_controllers(const struct bridge *br, struct ovsrec_controller ***controllersp); static void bridge_add_del_ports(struct bridge *, @@ -345,6 +347,9 @@ bridge_init(const char *remote) bridge_unixctl_dump_flows, NULL); unixctl_command_register("bridge/reconnect", "[bridge]", 0, 1, bridge_unixctl_reconnect, NULL); + unixctl_command_register("iface/set-admin-state", "[iface] up|down", 1, 2, + iface_unixctl_set_admin_state, NULL); + lacp_init(); bond_init(); cfm_init(); @@ -2442,6 +2447,54 @@ bridge_unixctl_reconnect(struct unixctl_conn *conn, int argc, unixctl_command_reply(conn, NULL); } +static void +iface_set_admin_state(struct iface *iface, bool up) +{ + if (up) { + netdev_turn_flags_on(iface->netdev, NETDEV_UP, true); + } else { + netdev_turn_flags_off(iface->netdev, NETDEV_UP, true); + } +} + +static void +iface_unixctl_set_admin_state(struct unixctl_conn *conn, int argc, + const char *argv[], void *aux OVS_UNUSED) +{ + bool up; + + if (!strcasecmp(argv[argc - 1] , "up")) { + up = true; + } else if ( !strcasecmp(argv[argc - 1] , "down")) { + up = false; + } else { + unixctl_command_reply_error(conn, "Invalid Admin State"); + return; + } + + if (argc > 2) { + struct iface *iface = iface_find(argv[1]); + + if (iface) { + iface_set_admin_state(iface, up); + } else { + unixctl_command_reply_error(conn, "Unknown Interface"); + return; + } + } else { + struct bridge *br; + + HMAP_FOR_EACH (br, node, &all_bridges) { + struct iface *iface; + + HMAP_FOR_EACH (iface, name_node, &br->iface_by_name) { + iface_set_admin_state(iface, up); + } + } + } + unixctl_command_reply(conn, "OK"); +} + static size_t bridge_get_controllers(const struct bridge *br, struct ovsrec_controller ***controllersp) -- 1.7.11.4 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev