X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Flacp.c;h=244b86e687e77081c6bc8e9e91b8a4739f83e9eb;hb=4cf6a09c619d2c362ecfa688c90aadae4b1be39e;hp=6ee55c3614fbe45f54af979ba52c9c9402ebd427;hpb=69fdadb1a9528ffb1a800ebd6997c826e55df972;p=sliver-openvswitch.git diff --git a/lib/lacp.c b/lib/lacp.c index 6ee55c361..244b86e68 100644 --- a/lib/lacp.c +++ b/lib/lacp.c @@ -25,6 +25,7 @@ #include "ofpbuf.h" #include "packets.h" #include "poll-loop.h" +#include "shash.h" #include "timer.h" #include "timeval.h" #include "unixctl.h" @@ -135,8 +136,7 @@ static bool slave_may_tx(const struct slave *); static struct slave *slave_lookup(const struct lacp *, const void *slave); static bool info_tx_equal(struct lacp_info *, struct lacp_info *); -static void lacp_unixctl_show(struct unixctl_conn *, const char *args, - void *aux); +static unixctl_cb_func lacp_unixctl_show; /* Populates 'pdu' with a LACP PDU comprised of 'actor' and 'partner'. */ static void @@ -187,7 +187,8 @@ 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]", 0, 1, + lacp_unixctl_show, NULL); } /* Creates a LACP object. */ @@ -242,7 +243,9 @@ lacp_configure(struct lacp *lacp, const struct lacp_settings *s) lacp->active = s->active; lacp->lacp_time = s->lacp_time; - lacp->custom_time = MAX(TIME_UPDATE_INTERVAL, s->custom_time); + lacp->custom_time = (s->lacp_time == LACP_TIME_CUSTOM + ? MAX(TIME_UPDATE_INTERVAL, s->custom_time) + : 0); } /* Returns true if 'lacp' is configured in active mode, false if 'lacp' is @@ -726,42 +729,46 @@ static void ds_put_lacp_state(struct ds *ds, uint8_t state) { if (state & LACP_STATE_ACT) { - ds_put_cstr(ds, "activity "); + ds_put_cstr(ds, " activity"); } if (state & LACP_STATE_TIME) { - ds_put_cstr(ds, "timeout "); + ds_put_cstr(ds, " timeout"); } if (state & LACP_STATE_AGG) { - ds_put_cstr(ds, "aggregation "); + ds_put_cstr(ds, " aggregation"); } if (state & LACP_STATE_SYNC) { - ds_put_cstr(ds, "synchronized "); + ds_put_cstr(ds, " synchronized"); } if (state & LACP_STATE_COL) { - ds_put_cstr(ds, "collecting "); + ds_put_cstr(ds, " collecting"); } if (state & LACP_STATE_DIST) { - ds_put_cstr(ds, "distributing "); + ds_put_cstr(ds, " distributing"); } if (state & LACP_STATE_DEF) { - ds_put_cstr(ds, "defaulted "); + ds_put_cstr(ds, " defaulted"); } if (state & LACP_STATE_EXP) { - ds_put_cstr(ds, "expired "); + ds_put_cstr(ds, " expired"); } } static void lacp_print_details(struct ds *ds, struct lacp *lacp) { + struct shash slave_shash = SHASH_INITIALIZER(&slave_shash); + const struct shash_node **sorted_slaves = NULL; + struct slave *slave; + int i; ds_put_format(ds, "---- %s ----\n", lacp->name); ds_put_format(ds, "\tstatus: %s", lacp->active ? "active" : "passive"); @@ -799,9 +806,15 @@ lacp_print_details(struct ds *ds, struct lacp *lacp) } HMAP_FOR_EACH (slave, node, &lacp->slaves) { + shash_add(&slave_shash, slave->name, slave); + } + sorted_slaves = shash_sort(&slave_shash); + + for (i = 0; i < shash_count(&slave_shash); i++) { char *status; struct lacp_info actor; + slave = sorted_slaves[i]->data; slave_get_actor(slave, &actor); switch (slave->status) { case LACP_CURRENT: @@ -832,7 +845,7 @@ lacp_print_details(struct ds *ds, struct lacp *lacp) ntohs(actor.port_priority)); ds_put_format(ds, "\tactor key: %u\n", ntohs(actor.key)); - ds_put_cstr(ds, "\tactor state: "); + ds_put_cstr(ds, "\tactor state:"); ds_put_lacp_state(ds, actor.state); ds_put_cstr(ds, "\n\n"); @@ -846,21 +859,24 @@ lacp_print_details(struct ds *ds, struct lacp *lacp) ntohs(slave->partner.port_priority)); ds_put_format(ds, "\tpartner key: %u\n", ntohs(slave->partner.key)); - ds_put_cstr(ds, "\tpartner state: "); + ds_put_cstr(ds, "\tpartner state:"); ds_put_lacp_state(ds, slave->partner.state); ds_put_cstr(ds, "\n"); } + + shash_destroy(&slave_shash); + free(sorted_slaves); } static void -lacp_unixctl_show(struct unixctl_conn *conn, - const char *args, void *aux OVS_UNUSED) +lacp_unixctl_show(struct unixctl_conn *conn, int argc, const char *argv[], + void *aux OVS_UNUSED) { struct ds ds = DS_EMPTY_INITIALIZER; struct lacp *lacp; - if (strlen(args)) { - lacp = lacp_find(args); + if (argc > 1) { + lacp = lacp_find(argv[1]); if (!lacp) { unixctl_command_reply(conn, 501, "no such lacp object"); return;