From 7056d802b9c595dd16f1354649bb7ae2f8b8880c Mon Sep 17 00:00:00 2001 From: Vincent Bernat Date: Sat, 26 Oct 2019 19:40:44 +0200 Subject: [PATCH] lldpcli: ask for power pairs only when PSE --- NEWS | 2 ++ src/client/conf-power.c | 13 +++++++------ src/client/display.c | 11 +++++++---- src/client/lldpcli.8.in | 2 +- src/lib/atoms/dot3.c | 2 ++ tests/integration/test_dot3.py | 4 +--- tests/lldpcli.conf | 2 +- 7 files changed, 21 insertions(+), 15 deletions(-) diff --git a/NEWS b/NEWS index 5e4cf8d0..903609ff 100644 --- a/NEWS +++ b/NEWS @@ -8,6 +8,8 @@ lldpd (1.0.5) + Add support for 802.3BT (no SNMP support). * Fix: + Don't clear chassis TLV on shutdown LLDPDU. + + Don't require/display powerpairs for Dot3 power when device type + is PD. lldpd (1.0.4) * Changes: diff --git a/src/client/conf-power.c b/src/client/conf-power.c index ef6f9ccd..52a676a8 100644 --- a/src/client/conf-power.c +++ b/src/client/conf-power.c @@ -121,7 +121,7 @@ cmd_dot3power(struct lldpctl_conn_t *conn, struct writer *w, /* Powerpairs */ (what = "power pairs", lldpctl_atom_set_str(dot3_power, lldpctl_k_dot3_power_pairs, - cmdenv_get(env, "powerpairs"))) == NULL || + cmdenv_get(env, "powerpairs")?cmdenv_get(env, "powerpairs"):"unknown")) == NULL || /* Class */ (what = "power class", cmdenv_get(env, "class")? lldpctl_atom_set_str(dot3_power, @@ -304,10 +304,11 @@ register_commands_medpow(struct cmd_node *configure_med) static int cmd_check_env_power(struct cmd_env *env, void *nothing) { - /* We need type and powerpair but if we have typeat, we also request - * source, priority, requested and allocated. */ + /* We need type. If we type is PSE, we need powerpairs. If we have + * typeat, we also request source, priority, requested and allocated. */ if (!cmdenv_get(env, "device-type")) return 0; - if (!cmdenv_get(env, "powerpairs")) return 0; + if (!strcmp(cmdenv_get(env, "device-type"), "pse") && + !cmdenv_get(env, "powerpairs")) return 0; if (cmdenv_get(env, "typeat")) { return (!!cmdenv_get(env, "source") && !!cmdenv_get(env, "priority") && @@ -360,8 +361,8 @@ register_commands_dot3pow(struct cmd_node *configure_dot3) /* Power pairs */ struct cmd_node *powerpairs = commands_new( configure_dot3power, - "powerpairs", "Which pairs are currently used for power (mandatory)", - cmd_check_type_but_no, NULL, "powerpairs"); + "powerpairs", "Which pairs are currently used for power", + cmd_check_pse, NULL, "powerpairs"); for (lldpctl_map_t *pp_map = lldpctl_key_get_map(lldpctl_k_dot3_power_pairs); pp_map->string; diff --git a/src/client/display.c b/src/client/display.c index 809c5db8..396478ef 100644 --- a/src/client/display.c +++ b/src/client/display.c @@ -431,10 +431,13 @@ display_port(struct writer *w, lldpctl_atom_t *port, int details) tag_data(w, lldpctl_atom_get_str(dot3_power, lldpctl_k_dot3_power_devicetype));; tag_end(w); - tag_start(w, "pairs", "Power pairs"); - tag_data(w, lldpctl_atom_get_str(dot3_power, - lldpctl_k_dot3_power_pairs)); - tag_end(w); + if (lldpctl_atom_get_int(dot3_power, + lldpctl_k_dot3_power_devicetype) == LLDP_DOT3_POWER_PSE) { + tag_start(w, "pairs", "Power pairs"); + tag_data(w, lldpctl_atom_get_str(dot3_power, + lldpctl_k_dot3_power_pairs)); + tag_end(w); + } tag_start(w, "class", "Class"); tag_data(w, lldpctl_atom_get_str(dot3_power, lldpctl_k_dot3_power_class)); diff --git a/src/client/lldpcli.8.in b/src/client/lldpcli.8.in index 65b3d94d..5a9012e1 100644 --- a/src/client/lldpcli.8.in +++ b/src/client/lldpcli.8.in @@ -894,7 +894,7 @@ Here is an example of use: .Op Cd supported .Op Cd enabled .Op Cd paircontrol -.Cd powerpairs Ar powerpairs +.Op Cd powerpairs Ar powerpairs .Op Cd class Ar class .Op Cd type Ar type Cd source Ar source Cd priority Ar priority Cd requested Ar requested Cd allocated Ar allocated .Bd -ragged -offset XXXXXX diff --git a/src/lib/atoms/dot3.c b/src/lib/atoms/dot3.c index a9e456df..6f3a759c 100644 --- a/src/lib/atoms/dot3.c +++ b/src/lib/atoms/dot3.c @@ -48,6 +48,7 @@ static lldpctl_map_t port_dot3_power_pd_source_map[] = { static struct atom_map port_dot3_power_pairs_map = { .key = lldpctl_k_dot3_power_pairs, .map = { + { 0, "unknown" }, { LLDP_DOT3_POWERPAIRS_SIGNAL, "signal" }, { LLDP_DOT3_POWERPAIRS_SPARE, "spare" }, { 0, NULL } @@ -387,6 +388,7 @@ _lldpctl_atom_set_int_dot3_power(lldpctl_atom_t *atom, lldpctl_key_t key, } case lldpctl_k_dot3_power_pairs: switch (value) { + case 0: case 1: case 2: port->p_power.pairs = value; diff --git a/tests/integration/test_dot3.py b/tests/integration/test_dot3.py index 1eb5ee46..9a4ebdf3 100644 --- a/tests/integration/test_dot3.py +++ b/tests/integration/test_dot3.py @@ -28,13 +28,12 @@ class TestLldpDot3(object): 'device-type': 'PSE', 'pairs': 'spare', 'class': 'class 3'}), - ("pd supported enabled powerpairs spare class class-3 type 1 source " + ("pd supported enabled class class-3 type 1 source " "pse priority low requested 10000 allocated 15000", {'supported': 'yes', 'enabled': 'yes', 'paircontrol': 'no', 'device-type': 'PD', - 'pairs': 'spare', 'class': 'class 3', 'power-type': '1', 'source': 'Primary power source', @@ -66,7 +65,6 @@ class TestLldpDot3(object): result = lldpcli( *shlex.split("configure dot3 power pd " "supported enabled paircontrol " - "powerpairs spare " "class class-3 " "type 1 source both priority low " "requested 20000 allocated 5000")) diff --git a/tests/lldpcli.conf b/tests/lldpcli.conf index 8a5ab296..7ba2d9fc 100644 --- a/tests/lldpcli.conf +++ b/tests/lldpcli.conf @@ -54,7 +54,7 @@ configure med power pd source pse priority high value 5000 configure ports eth0 med power pd source pse priority high value 5000 configure dot3 power pse supported enabled paircontrol powerpairs spare class class-3 configure ports eth0 dot3 power pse supported enabled paircontrol powerpairs spare class class-3 -configure dot3 power pd supported enabled powerpairs spare class class-3 type 1 source pse priority low requested 10000 allocated 15000 +configure dot3 power pd supported enabled class class-3 type 1 source pse priority low requested 10000 allocated 15000 # A convenient way to "test" lldpcli and liblldpctl is to load those commands in lldpcli with valgrind: # libtool execute valgrind --suppressions=../src/client/lldpcli.supp --leak-check=full src/client/lldpcli -c ../tests/lldpcli.conf -- 2.39.2