----
- src/client/client.h | 2 +
- src/client/display.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++-
- src/client/show.c | 44 ++++++++++++++++++++++++++++++++++++++
- src/lib/atoms/port.c | 7 ++++++
- src/lib/lldpctl.h | 1
- 5 files changed, 112 insertions(+), 1 deletion(-)
-
---- a/src/client/client.h
-+++ b/src/client/client.h
-@@ -115,6 +115,8 @@ char* totag(const char *);
- #define DISPLAY_DETAILS 3
- void display_interfaces(lldpctl_conn_t *, struct writer *,
- struct cmd_env *, int, int);
-+void display_local_interfaces(lldpctl_conn_t *, struct writer *,
-+ struct cmd_env *, int, int);
- void display_interface(lldpctl_conn_t *, struct writer *, int,
- lldpctl_atom_t *, lldpctl_atom_t *, int, int);
- void display_local_chassis(lldpctl_conn_t *, struct writer *,
---- a/src/client/display.c
-+++ b/src/client/display.c
-@@ -344,12 +344,23 @@ display_port(struct writer *w, lldpctl_a
- tag_datatag(w, "descr", "PortDescr",
- lldpctl_atom_get_str(port, lldpctl_k_port_descr));
-
-+ tag_datatag(w, "ttl", "Ttl",
-+ lldpctl_atom_get_str(port, lldpctl_k_port_ttl));
-+
- /* Dot3 */
- if (details == DISPLAY_DETAILS) {
- tag_datatag(w, "mfs", "MFS",
- lldpctl_atom_get_str(port, lldpctl_k_port_dot3_mfs));
-- tag_datatag(w, "aggregation", "Port is aggregated. PortAggregID",
-+
-+ long int lag_id = lldpctl_atom_get_int(port,
-+ lldpctl_k_port_dot3_aggregid);
-+ tag_start(w, "link-aggregation", "LinkAgg");
-+ tag_attr(w, "supported", "supported", "yes");
-+ tag_attr(w, "enabled", "enabled",
-+ (lag_id > 0)?"yes":"no");
-+ tag_datatag(w, "aggregation", "PortAggregID",
- lldpctl_atom_get_str(port, lldpctl_k_port_dot3_aggregid));
-+ tag_end(w);
-
- long int autoneg_support, autoneg_enabled, autoneg_advertised;
- autoneg_support = lldpctl_atom_get_int(port,
-@@ -663,6 +674,52 @@ display_interfaces(lldpctl_conn_t *conn,
- lldpctl_atom_dec_ref(port);
- }
- tag_end(w);
-+}
-+
-+/**
-+ * Display information about local interfaces.
-+ *
-+ * @param conn Connection to lldpd.
-+ * @param w Writer.
-+ * @param hidden Whatever to show hidden ports.
-+ * @param env Environment from which we may find the list of ports.
-+ * @param details Level of details we need (DISPLAY_*).
-+ */
-+void
-+display_local_interfaces(lldpctl_conn_t *conn, struct writer *w,
-+ struct cmd_env *env,
-+ int hidden, int details)
-+{
-+ lldpctl_atom_t *iface;
-+ int protocol = LLDPD_MODE_MAX;
-+ const char *proto_str;
-+
-+ /* user might have specified protocol to filter display results */
-+ proto_str = cmdenv_get(env, "protocol");
-+
-+ if (proto_str) {
-+ log_debug("display", "filter protocol: %s ", proto_str);
-+
-+ protocol = 0;
-+ for (lldpctl_map_t *protocol_map =
-+ lldpctl_key_get_map(lldpctl_k_port_protocol);
-+ protocol_map->string;
-+ protocol_map++) {
-+ if (!strcasecmp(proto_str, protocol_map->string)) {
-+ protocol = protocol_map->value;
-+ break;
-+ }
-+ }
-+ }
-+
-+ tag_start(w, "lldp", "LLDP interfaces");
-+ while ((iface = cmd_iterate_on_interfaces(conn, env))) {
-+ lldpctl_atom_t *port;
-+ port = lldpctl_get_port(iface);
-+ display_interface(conn, w, hidden, iface, port, details, protocol);
-+ lldpctl_atom_dec_ref(port);
-+ }
-+ tag_end(w);
- }
-
- void
---- a/src/client/show.c
-+++ b/src/client/show.c
-@@ -48,6 +48,35 @@ cmd_show_neighbors(struct lldpctl_conn_t
- }
-
- /**
-+ * Show interfaces.
-+ *
-+ * The environment will contain the following keys:
-+ * - C{ports} list of ports we want to restrict showing.
-+ * - C{hidden} if we should show hidden ports.
-+ * - C{summary} if we want to show only a summary
-+ * - C{detailed} for a detailed overview
-+ */
-+static int
-+cmd_show_interfaces(struct lldpctl_conn_t *conn, struct writer *w,
-+ struct cmd_env *env, void *arg)
-+{
-+ log_debug("lldpctl", "show interfaces data (%s) %s hidden interfaces",
-+ cmdenv_get(env, "summary")?"summary":
-+ cmdenv_get(env, "detailed")?"detailed":
-+ "normal", cmdenv_get(env, "hidden")?"with":"without");
-+ if (cmdenv_get(env, "ports"))
-+ log_debug("lldpctl", "restrict to the following ports: %s",
-+ cmdenv_get(env, "ports"));
-+
-+ display_local_interfaces(conn, w, env, !!cmdenv_get(env, "hidden"),
-+ cmdenv_get(env, "summary")?DISPLAY_BRIEF:
-+ cmdenv_get(env, "detailed")?DISPLAY_DETAILS:
-+ DISPLAY_NORMAL);
-+
-+ return 1;
-+}
-+
-+/**
- * Show chassis.
- *
- * The environment will contain the following keys:
-@@ -269,6 +298,12 @@ register_commands_show(struct cmd_node *
- "Show neighbors data",
- NULL, NULL, NULL);
-
-+ struct cmd_node *interfaces = commands_new(
-+ show,
-+ "interfaces",
-+ "Show interfaces data",
-+ NULL, NULL, NULL);
-+
- struct cmd_node *chassis = commands_new(
- show,
- "chassis",
-@@ -289,6 +324,15 @@ register_commands_show(struct cmd_node *
-
- register_common_commands(neighbors, 1);
-
-+ /* Interfaces data */
-+ commands_new(interfaces,
-+ NEWLINE,
-+ "Show interfaces data",
-+ NULL, cmd_show_interfaces, NULL);
-+
-+ cmd_restrict_ports(interfaces);
-+ register_common_commands(interfaces, 0);
-+
- /* Chassis data */
- commands_new(chassis,
- NEWLINE,
---- a/src/lib/atoms/port.c
-+++ b/src/lib/atoms/port.c
-@@ -19,6 +19,7 @@
- #include <stdarg.h>
- #include <string.h>
- #include <arpa/inet.h>
-+#include <time.h>
-
- #include "lldpctl.h"
- #include "../log.h"
-@@ -544,6 +545,7 @@ _lldpctl_atom_get_int_port(lldpctl_atom_
- (struct _lldpctl_atom_port_t *)atom;
- struct lldpd_port *port = p->port;
- struct lldpd_hardware *hardware = p->hardware;
-+ time_t now = time(NULL);
-
- /* Local port only */
- if (hardware != NULL) {
-@@ -585,6 +587,11 @@ _lldpctl_atom_get_int_port(lldpctl_atom_
- return port->p_id_subtype;
- case lldpctl_k_port_hidden:
- return port->p_hidden_in;
-+ case lldpctl_k_port_ttl:
-+ if (port->p_lastupdate > 0)
-+ return (port->p_chassis->c_ttl - (now - port->p_lastupdate));
-+ else
-+ return port->p_chassis->c_ttl;
- #ifdef ENABLE_DOT3
- case lldpctl_k_port_dot3_mfs:
- if (port->p_mfs > 0)
---- a/src/lib/lldpctl.h
-+++ b/src/lib/lldpctl.h
-@@ -674,6 +674,7 @@ typedef enum {
- lldpctl_k_port_hidden, /**< `(I)` Is this port hidden (or should it be displayed?)? */
- lldpctl_k_port_status, /**< `(IS,WO)` Operational status of this (local) port */
- lldpctl_k_port_chassis, /**< `(A)` Chassis associated to the port */
-+ lldpctl_k_port_ttl, /**< `(I)` The port ttl. */
-
- lldpctl_k_port_dot3_mfs = 1300, /**< `(I)` MFS */
- lldpctl_k_port_dot3_aggregid, /**< `(I)` Port aggregation ID */