From: Justin Pettit Date: Mon, 26 Sep 2011 22:44:46 +0000 (-0700) Subject: lacp: Make argument to ovs-appctl "lacp/show" command optional. X-Git-Tag: v1.3.0~171 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=5dab8eced8eeb7faf193e2a96d75b9ee30b4c3eb;p=sliver-openvswitch.git lacp: Make argument to ovs-appctl "lacp/show" command optional. If an argument isn't passed to "lacp/show", it will print information about all interfaces with LACP enabled. --- diff --git a/NEWS b/NEWS index c2f62a11a..5d7c522ef 100644 --- a/NEWS +++ b/NEWS @@ -8,6 +8,8 @@ Post-v1.2.0 - New "version" command to determine version of running daemon. - If no argument is provided for "cfm/show", displays detailed information about all interfaces with CFM enabled. + - If no argument is provided for "lacp/show", displays detailed + information about all ports with LACP enabled. - ovs-vswitchd: - The software switch now supports 255 OpenFlow tables, instead of just one. By default, only table 0 is consulted, but the diff --git a/lib/lacp.c b/lib/lacp.c index a565419d6..22cba9429 100644 --- a/lib/lacp.c +++ b/lib/lacp.c @@ -187,7 +187,7 @@ parse_lacp_packet(const struct ofpbuf *b) void lacp_init(void) { - unixctl_command_register("lacp/show", "port", lacp_unixctl_show, NULL); + unixctl_command_register("lacp/show", "[port]", lacp_unixctl_show, NULL); } /* Creates a LACP object. */ @@ -757,53 +757,43 @@ ds_put_lacp_state(struct ds *ds, uint8_t state) } static void -lacp_unixctl_show(struct unixctl_conn *conn, - const char *args, void *aux OVS_UNUSED) +lacp_print_details(struct ds *ds, struct lacp *lacp) { - struct ds ds = DS_EMPTY_INITIALIZER; - struct lacp *lacp; struct slave *slave; - lacp = lacp_find(args); - if (!lacp) { - unixctl_command_reply(conn, 501, "no such lacp object"); - return; - } - - ds_put_format(&ds, "lacp: %s\n", lacp->name); - - ds_put_format(&ds, "\tstatus: %s", lacp->active ? "active" : "passive"); + ds_put_format(ds, "---- %s ----\n", lacp->name); + ds_put_format(ds, "\tstatus: %s", lacp->active ? "active" : "passive"); if (lacp->heartbeat) { - ds_put_cstr(&ds, " heartbeat"); + ds_put_cstr(ds, " heartbeat"); } if (lacp->negotiated) { - ds_put_cstr(&ds, " negotiated"); + ds_put_cstr(ds, " negotiated"); } - ds_put_cstr(&ds, "\n"); + ds_put_cstr(ds, "\n"); - ds_put_format(&ds, "\tsys_id: " ETH_ADDR_FMT "\n", ETH_ADDR_ARGS(lacp->sys_id)); - ds_put_format(&ds, "\tsys_priority: %u\n", lacp->sys_priority); - ds_put_cstr(&ds, "\taggregation key: "); + ds_put_format(ds, "\tsys_id: " ETH_ADDR_FMT "\n", ETH_ADDR_ARGS(lacp->sys_id)); + ds_put_format(ds, "\tsys_priority: %u\n", lacp->sys_priority); + ds_put_cstr(ds, "\taggregation key: "); if (lacp->key_slave) { - ds_put_format(&ds, "%u", lacp->key_slave->port_id); + ds_put_format(ds, "%u", lacp->key_slave->port_id); } else { - ds_put_cstr(&ds, "none"); + ds_put_cstr(ds, "none"); } - ds_put_cstr(&ds, "\n"); + ds_put_cstr(ds, "\n"); - ds_put_cstr(&ds, "\tlacp_time: "); + ds_put_cstr(ds, "\tlacp_time: "); switch (lacp->lacp_time) { case LACP_TIME_FAST: - ds_put_cstr(&ds, "fast\n"); + ds_put_cstr(ds, "fast\n"); break; case LACP_TIME_SLOW: - ds_put_cstr(&ds, "slow\n"); + ds_put_cstr(ds, "slow\n"); break; case LACP_TIME_CUSTOM: - ds_put_format(&ds, "custom (%lld)\n", lacp->custom_time); + ds_put_format(ds, "custom (%lld)\n", lacp->custom_time); break; default: - ds_put_cstr(&ds, "unknown\n"); + ds_put_cstr(ds, "unknown\n"); } HMAP_FOR_EACH (slave, node, &lacp->slaves) { @@ -825,38 +815,59 @@ lacp_unixctl_show(struct unixctl_conn *conn, NOT_REACHED(); } - ds_put_format(&ds, "\nslave: %s: %s %s\n", slave->name, status, + ds_put_format(ds, "\nslave: %s: %s %s\n", slave->name, status, slave->attached ? "attached" : "detached"); - ds_put_format(&ds, "\tport_id: %u\n", slave->port_id); - ds_put_format(&ds, "\tport_priority: %u\n", slave->port_priority); + ds_put_format(ds, "\tport_id: %u\n", slave->port_id); + ds_put_format(ds, "\tport_priority: %u\n", slave->port_priority); - ds_put_format(&ds, "\n\tactor sys_id: " ETH_ADDR_FMT "\n", + ds_put_format(ds, "\n\tactor sys_id: " ETH_ADDR_FMT "\n", ETH_ADDR_ARGS(actor.sys_id)); - ds_put_format(&ds, "\tactor sys_priority: %u\n", + ds_put_format(ds, "\tactor sys_priority: %u\n", ntohs(actor.sys_priority)); - ds_put_format(&ds, "\tactor port_id: %u\n", + ds_put_format(ds, "\tactor port_id: %u\n", ntohs(actor.port_id)); - ds_put_format(&ds, "\tactor port_priority: %u\n", + ds_put_format(ds, "\tactor port_priority: %u\n", ntohs(actor.port_priority)); - ds_put_format(&ds, "\tactor key: %u\n", + ds_put_format(ds, "\tactor key: %u\n", ntohs(actor.key)); - ds_put_cstr(&ds, "\tactor state: "); - ds_put_lacp_state(&ds, actor.state); - ds_put_cstr(&ds, "\n\n"); + ds_put_cstr(ds, "\tactor state: "); + ds_put_lacp_state(ds, actor.state); + ds_put_cstr(ds, "\n\n"); - ds_put_format(&ds, "\tpartner sys_id: " ETH_ADDR_FMT "\n", + ds_put_format(ds, "\tpartner sys_id: " ETH_ADDR_FMT "\n", ETH_ADDR_ARGS(slave->partner.sys_id)); - ds_put_format(&ds, "\tpartner sys_priority: %u\n", + ds_put_format(ds, "\tpartner sys_priority: %u\n", ntohs(slave->partner.sys_priority)); - ds_put_format(&ds, "\tpartner port_id: %u\n", + ds_put_format(ds, "\tpartner port_id: %u\n", ntohs(slave->partner.port_id)); - ds_put_format(&ds, "\tpartner port_priority: %u\n", + ds_put_format(ds, "\tpartner port_priority: %u\n", ntohs(slave->partner.port_priority)); - ds_put_format(&ds, "\tpartner key: %u\n", + ds_put_format(ds, "\tpartner key: %u\n", ntohs(slave->partner.key)); - ds_put_cstr(&ds, "\tpartner state: "); - ds_put_lacp_state(&ds, slave->partner.state); - ds_put_cstr(&ds, "\n"); + ds_put_cstr(ds, "\tpartner state: "); + ds_put_lacp_state(ds, slave->partner.state); + ds_put_cstr(ds, "\n"); + } +} + +static void +lacp_unixctl_show(struct unixctl_conn *conn, + const char *args, void *aux OVS_UNUSED) +{ + struct ds ds = DS_EMPTY_INITIALIZER; + struct lacp *lacp; + + if (strlen(args)) { + lacp = lacp_find(args); + if (!lacp) { + unixctl_command_reply(conn, 501, "no such lacp object"); + return; + } + lacp_print_details(&ds, lacp); + } else { + LIST_FOR_EACH (lacp, node, &all_lacps) { + lacp_print_details(&ds, lacp); + } } unixctl_command_reply(conn, 200, ds_cstr(&ds)); diff --git a/vswitchd/ovs-vswitchd.8.in b/vswitchd/ovs-vswitchd.8.in index f9023d6b9..5bca902d6 100644 --- a/vswitchd/ovs-vswitchd.8.in +++ b/vswitchd/ovs-vswitchd.8.in @@ -183,12 +183,14 @@ status of \fIslave\fR changes. Returns the hash value which would be used for \fImac\fR with \fIvlan\fR and \fIbasis\fR if specified. . -.IP "\fBlacp/show\fR \fIport\fR" +.IP "\fBlacp/show\fR [\fIport\fR]" Lists all of the LACP related information about the given \fIport\fR: active or passive, aggregation key, system id, and system priority. Also lists information about each slave: whether it is enabled or disabled, whether it is attached or detached, port id and priority, actor -information, and partner information. +information, and partner information. If \fIport\fR is not specified, +then displays detailed information about all interfaces with CFM +enabled. . .so ofproto/ofproto-unixctl.man .so lib/vlog-unixctl.man