From patchwork Wed Jun 25 10:27:08 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Changliang Wu X-Patchwork-Id: 2102469 X-Patchwork-Delegate: aconole@redhat.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=smartx-com.20230601.gappssmtp.com header.i=@smartx-com.20230601.gappssmtp.com header.a=rsa-sha256 header.s=20230601 header.b=XHymQ9zG; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=2605:bc80:3010::137; helo=smtp4.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=patchwork.ozlabs.org) Received: from smtp4.osuosl.org (smtp4.osuosl.org [IPv6:2605:bc80:3010::137]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4bRygS2Rfcz20KF for ; Wed, 25 Jun 2025 20:27:32 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id 4868141CDE; Wed, 25 Jun 2025 10:27:43 +0000 (UTC) X-Virus-Scanned: amavis at osuosl.org Received: from smtp4.osuosl.org ([127.0.0.1]) by localhost (smtp4.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP id 2rm8GEXZ74oB; Wed, 25 Jun 2025 10:27:42 +0000 (UTC) X-Comment: SPF check N/A for local connections - client-ip=140.211.9.56; helo=lists.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver= DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org 1B0C841CA1 Authentication-Results: smtp4.osuosl.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=smartx-com.20230601.gappssmtp.com header.i=@smartx-com.20230601.gappssmtp.com header.a=rsa-sha256 header.s=20230601 header.b=XHymQ9zG Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp4.osuosl.org (Postfix) with ESMTPS id 1B0C841CA1; Wed, 25 Jun 2025 10:27:42 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 04ED9C02A6; Wed, 25 Jun 2025 10:27:42 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp4.osuosl.org (smtp4.osuosl.org [140.211.166.137]) by lists.linuxfoundation.org (Postfix) with ESMTP id 61581C02A6 for ; Wed, 25 Jun 2025 10:27:41 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id 5EC4141CD1 for ; Wed, 25 Jun 2025 10:27:41 +0000 (UTC) X-Virus-Scanned: amavis at osuosl.org Received: from smtp4.osuosl.org ([127.0.0.1]) by localhost (smtp4.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP id QdC3sxHBOxmN for ; Wed, 25 Jun 2025 10:27:40 +0000 (UTC) Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=2607:f8b0:4864:20::42e; helo=mail-pf1-x42e.google.com; envelope-from=changliang.wu@smartx.com; receiver= DMARC-Filter: OpenDMARC Filter v1.4.2 smtp4.osuosl.org 466DC40C75 Authentication-Results: smtp4.osuosl.org; dmarc=pass (p=none dis=none) header.from=smartx.com DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org 466DC40C75 Received: from mail-pf1-x42e.google.com (mail-pf1-x42e.google.com [IPv6:2607:f8b0:4864:20::42e]) by smtp4.osuosl.org (Postfix) with ESMTPS id 466DC40C75 for ; Wed, 25 Jun 2025 10:27:40 +0000 (UTC) Received: by mail-pf1-x42e.google.com with SMTP id d2e1a72fcca58-747abb3cd0bso649821b3a.1 for ; Wed, 25 Jun 2025 03:27:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=smartx-com.20230601.gappssmtp.com; s=20230601; t=1750847259; x=1751452059; darn=openvswitch.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=N7RPSYjpzk/Xtt4pQyj3iVjMOtMNJtbLIjlA+5lZPPc=; b=XHymQ9zGzgRxu/TwiCnNIr2igmj8oRBa3xv4CN1qyM5mvizLEvojU3WllBMvxESQPq I36LfF6ArYujOtcsJ9PigSFIRhHZRCwVf3I4aD8ljTtWd7Seah/awjIoOOC5B+H5Zrh1 wL60orOGymqTp5tBtoMQNgb6XC6e4uWWQtvRdP5BX2do19vHjbIKPYWbuSnEJ2zH/L4L CHvJq1+eoLjKkUfrp4rX839Mj8O0jwp86Qr2c77gAB2nxIoWXytmxMbKjgc1wQUuFpVk GbJeQYzKnqtsTI0hpnEONIaiyC8+4zky0mIurCPUSTbMeAWmKbBUAro/QYOn5x8wWuk9 V2Qg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750847259; x=1751452059; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=N7RPSYjpzk/Xtt4pQyj3iVjMOtMNJtbLIjlA+5lZPPc=; b=NmSUiuyFyh1dGnKWMLaBOLOywWytoPT3w1Ppiuqd+TjBBbQp8Nf2pZ91s9KPB7Jg5T sYVrT9FmNMeYs8w6BblYXNRjcEa/CFUPOQHydGw7inNDW39+jCpcz1Qy+56YqLR8LaCl 3N5ESTjY9OUfio53KcHKtKwqrvxOi1jOXSfJPYymggMsUWX9BUIq7wqtZ+hTPh2h1Azb thDdk4rEBCxys32jI4Aukg1lWiwtOvHjYqbofbGhuy9eZFOSXMlcBcpb8TIaBp6BEF7i ydJpt/MdsV2AtcT9XCATjyQX7deiXZ7PquRZZW/sDOsYWe3hSei1Sl0iroDTcfYOvEwb 9waA== X-Forwarded-Encrypted: i=1; AJvYcCVot9gBriA6Mp+PBR5lZDklV65qXC+tl0rF/ZGoXUGxM/M3JNb3X40pmW2kzG7/pV0/m5Q=@openvswitch.org X-Gm-Message-State: AOJu0YxnsjIZ+AjrmtpHfyC/THTfkE7MXDxMhxLoCQxMSOJbmHu8G+zL RmSKatMp0piuG1qQx4yhtz1+s5bwshKpvBOX6eAa/ix2wq7t+DXJeFyjiOthqo0iLTM= X-Gm-Gg: ASbGncvQOdHh/oYCgabpJ9jkBLtolH3nJTwgyQjz9DlRdrl0g++PDj7c8yn/42dqoLW 24Li+Zew12CHzQAxIfIB8YtOLr/XUiROnT4d09vb6cAqyg7KUXEkFf6625K3riz02MO+ESq0+bF +Bejp22Dmcj/Q+A6LNI8wVRlgbJNQJebq2kiFjsublFwhkMJG6AD1MpgOBzVAUnSBVpCvnXqWsf 45ipGmHZmXtCt3J7IZ+/u47GUUb18FRg3dPBt8dHnVqn6J7Q7vO68buKitx0V62QyUjsOZD6ul+ yGvhQiryxJ+qW5MfKSe+dliAM++fJESaz49og2q6eEwnlprICQZrjB1XHnAbRvghoNRlh7HxJlR rk9diBXTlQqbxidQomUjY6wyPdlvEPUf0orfECQfE2OBodzMCe+kMY2PhBUw= X-Google-Smtp-Source: AGHT+IFMDqVYvvzmITM8MLpmaAmz0HjG0MALP07b/zYqCuODF7/yCs7/OH2ciexVIJtNz1J8DEZEDQ== X-Received: by 2002:a17:902:c409:b0:235:e1e4:edb0 with SMTP id d9443c01a7336-238024c0447mr113391975ad.22.1750847259250; Wed, 25 Jun 2025 03:27:39 -0700 (PDT) Received: from localhost.localdomain ([154.64.226.185]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-237d83f1e1fsm133350635ad.83.2025.06.25.03.27.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 25 Jun 2025 03:27:38 -0700 (PDT) From: Changliang Wu To: aconole@redhat.com, echaudro@redhat.com, i.maximets@ovn.org, dev@openvswitch.org Date: Wed, 25 Jun 2025 18:27:08 +0800 Message-ID: <20250625102710.822034-2-changliang.wu@smartx.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20250625102710.822034-1-changliang.wu@smartx.com> References: <20250625102710.822034-1-changliang.wu@smartx.com> MIME-Version: 1.0 Subject: [ovs-dev] [PATCH 1/3] lldp: Add ovs-appctl lldp/neighbor command. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" New appctl 'lldp/neighbor' displays lldp neighbor information. Support json output with --format json --pretty Signed-off-by: Changliang Wu --- NEWS | 1 + lib/ovs-lldp.c | 327 +++++++++++++++++++++++++++++++++++++ vswitchd/ovs-vswitchd.8.in | 4 + 3 files changed, 332 insertions(+) diff --git a/NEWS b/NEWS index d7231fabc..c66b41e64 100644 --- a/NEWS +++ b/NEWS @@ -15,6 +15,7 @@ Post-v3.5.0 core file size. - ovs-appctl: * Added JSON output support to the 'ovs/route/show' command. + * Added 'lldp/neighbor' command that displays lldp neighbor infomation. - SSL/TLS: * Support for deprecated TLSv1 and TLSv1.1 protocols on OpenFlow and database connections is now removed. diff --git a/lib/ovs-lldp.c b/lib/ovs-lldp.c index 152777248..da8faf873 100644 --- a/lib/ovs-lldp.c +++ b/lib/ovs-lldp.c @@ -35,8 +35,11 @@ #include #include #include "openvswitch/dynamic-string.h" +#include "openvswitch/json.h" #include "flow.h" #include "openvswitch/list.h" +#include "lldp/lldp-const.h" +#include "lldp/lldp-tlv.h" #include "lldp/lldpd.h" #include "lldp/lldpd-structs.h" #include "netdev.h" @@ -310,6 +313,281 @@ aa_print_isid_status(struct ds *ds, struct lldp *lldp) OVS_REQUIRES(mutex) } } +static void +lldp_print_neighbor(struct ds *ds, struct lldp *lldp) OVS_REQUIRES(mutex) +{ + struct lldpd_hardware *hw; + struct lldpd_port *port; + const char *none_str = ""; + + if (!lldp->lldpd) { + return; + } + + LIST_FOR_EACH (hw, h_entries, &lldp->lldpd->g_hardware) { + LIST_FOR_EACH (port, p_entries, &hw->h_rports) { + if (!port->p_chassis) { + continue; + } + ds_put_format(ds, "Interface: %s\n", lldp->name); + ds_put_format(ds, " Chassis:\n"); + + struct ds id = DS_EMPTY_INITIALIZER; + if (port->p_chassis->c_id_len > 0) { + ds_put_hex_with_delimiter(&id, port->p_chassis->c_id, + port->p_chassis->c_id_len, ":"); + } + ds_put_format(ds, " Chassis ID:\t %s\n", + id.length ? ds_cstr_ro(&id) : none_str); + ds_put_format(ds, " SysName:\t %s\n", + strlen(port->p_chassis->c_name) + ? port->p_chassis->c_name + : none_str); + ds_put_format(ds, " SysDescr:\t %s\n", + strlen(port->p_chassis->c_descr) + ? port->p_chassis->c_descr + : none_str); + ds_destroy(&id); + + struct lldpd_mgmt *mgmt; + LIST_FOR_EACH (mgmt, m_entries, &port->p_chassis->c_mgmt) { + struct in6_addr ip; + switch (mgmt->m_family) { + case LLDPD_AF_IPV4: + in6_addr_set_mapped_ipv4(&ip, mgmt->m_addr.inet.s_addr); + break; + case LLDPD_AF_IPV6: ip = mgmt->m_addr.inet6; break; + default: continue; + } + ds_put_format(ds, " MgmtIP:\t "); + ipv6_format_mapped(&ip, ds); + ds_put_format(ds, "\n"); + ds_put_format(ds, " MgmtIface:\t %d\n", mgmt->m_iface); + } + + if (port->p_chassis->c_cap_available & LLDP_CAP_BRIDGE) { + ds_put_format(ds, " Capability:\t Bridge, %s\n", + port->p_chassis->c_cap_enabled & LLDP_CAP_BRIDGE + ? "on" + : "off"); + } + if (port->p_chassis->c_cap_available & LLDP_CAP_ROUTER) { + ds_put_format(ds, " Capability:\t Router, %s\n", + port->p_chassis->c_cap_enabled & LLDP_CAP_ROUTER + ? "on" + : "off"); + } + if (port->p_chassis->c_cap_available & LLDP_CAP_WLAN) { + ds_put_format(ds, " Capability:\t Wlan, %s\n", + port->p_chassis->c_cap_enabled & LLDP_CAP_WLAN + ? "on" + : "off"); + } + if (port->p_chassis->c_cap_available & LLDP_CAP_STATION) { + ds_put_format(ds, " Capability:\t Station, %s\n", + port->p_chassis->c_cap_enabled & LLDP_CAP_STATION + ? "on" + : "off"); + } + + ds_put_format(ds, " Port:\n"); + + if (port->p_id_subtype == LLDP_PORTID_SUBTYPE_LLADDR) { + ds_init(&id); + if (port->p_id_len > 0) { + ds_put_hex_with_delimiter(&id, (uint8_t *) port->p_id, + port->p_id_len, ":"); + } + ds_put_format(ds, " PortID:\t %s\n", + id.length ? ds_cstr_ro(&id) : none_str); + ds_destroy(&id); + } else { + ds_put_format(ds, " PortID:\t %.*s\n", + (int) (port->p_id ? port->p_id_len + : strlen(none_str)), + port->p_id ?: none_str); + } + ds_put_format(ds, " PortDescr:\t %s\n", + strlen(port->p_descr) ? port->p_descr : none_str); + ds_put_format(ds, " TTL:\t %d\n", port->p_chassis->c_ttl); + + ds_put_format(ds, "-----------------------------------------------" + "--------------------------------\n"); + } + } +} + +static void +lldp_print_neighbor_json(struct json *interface_array_json, struct lldp *lldp) + OVS_REQUIRES(mutex) +{ + struct lldpd_hardware *hw; + struct lldpd_port *port; + const char *none_str = ""; + + if (!lldp->lldpd) { + return; + } + + LIST_FOR_EACH (hw, h_entries, &lldp->lldpd->g_hardware) { + LIST_FOR_EACH (port, p_entries, &hw->h_rports) { + if (!port->p_chassis) { + continue; + } + + struct json *interface_item_json = json_object_create(); + struct json *interface_item_warp_json = json_object_create(); + struct json *chassis_json = json_object_create(); + struct json *chassis_sys_json = json_object_create(); + struct json *chassis_id_json = json_object_create(); + struct json *chassis_mgmt_ip_json = json_array_create_empty(); + struct json *chassis_mgmt_iface_json = json_array_create_empty(); + struct json *chassis_capability_json = json_array_create_empty(); + struct json *chassis_capability_item_json; + struct json *port_json = json_object_create(); + struct json *port_id_json = json_object_create(); + + struct ds id = DS_EMPTY_INITIALIZER; + if (port->p_chassis->c_id_len > 0) { + ds_put_hex_with_delimiter(&id, port->p_chassis->c_id, + port->p_chassis->c_id_len, ":"); + } + + json_object_put(chassis_id_json, "type", + json_string_create("mac")); + json_object_put(chassis_id_json, "value", + json_string_create(id.length ? ds_cstr_ro(&id) + : none_str)); + json_object_put(chassis_sys_json, "id", chassis_id_json); + + json_object_put(chassis_json, + strlen(port->p_chassis->c_name) + ? port->p_chassis->c_name + : none_str, + chassis_sys_json); + + json_object_put(chassis_sys_json, "descr", + json_string_create(strlen(port->p_chassis->c_descr) + ? port->p_chassis->c_descr + : none_str)); + + ds_destroy(&id); + + struct lldpd_mgmt *mgmt; + struct in6_addr ip; + char addr_str[INET6_ADDRSTRLEN]; + LIST_FOR_EACH (mgmt, m_entries, &port->p_chassis->c_mgmt) { + switch (mgmt->m_family) { + case LLDPD_AF_IPV4: + in6_addr_set_mapped_ipv4(&ip, mgmt->m_addr.inet.s_addr); + break; + case LLDPD_AF_IPV6: ip = mgmt->m_addr.inet6; break; + default: continue; + } + + ipv6_string_mapped(addr_str, &ip); + json_array_add(chassis_mgmt_ip_json, + json_string_create(addr_str)); + json_array_add(chassis_mgmt_iface_json, + json_integer_create(mgmt->m_iface)); + } + json_object_put(chassis_sys_json, "mgmt-ip", chassis_mgmt_ip_json); + json_object_put(chassis_sys_json, "mgmt-iface", + chassis_mgmt_iface_json); + + if (port->p_chassis->c_cap_available & LLDP_CAP_BRIDGE) { + chassis_capability_item_json = json_object_create(); + json_object_put(chassis_capability_item_json, "type", + json_string_create("Bridge")); + json_object_put( + chassis_capability_item_json, "enabled", + json_boolean_create(port->p_chassis->c_cap_enabled & + LLDP_CAP_BRIDGE)); + json_array_add(chassis_capability_json, + chassis_capability_item_json); + } + if (port->p_chassis->c_cap_available & LLDP_CAP_ROUTER) { + chassis_capability_item_json = json_object_create(); + json_object_put(chassis_capability_item_json, "type", + json_string_create("Router")); + json_object_put( + chassis_capability_item_json, "enabled", + json_boolean_create(port->p_chassis->c_cap_enabled & + LLDP_CAP_ROUTER)); + json_array_add(chassis_capability_json, + chassis_capability_item_json); + } + if (port->p_chassis->c_cap_available & LLDP_CAP_WLAN) { + chassis_capability_item_json = json_object_create(); + json_object_put(chassis_capability_item_json, "type", + json_string_create("Wlan")); + json_object_put( + chassis_capability_item_json, "enabled", + json_boolean_create(port->p_chassis->c_cap_enabled & + LLDP_CAP_WLAN)); + json_array_add(chassis_capability_json, + chassis_capability_item_json); + } + if (port->p_chassis->c_cap_available & LLDP_CAP_STATION) { + chassis_capability_item_json = json_object_create(); + json_object_put(chassis_capability_item_json, "type", + json_string_create("Station")); + json_object_put( + chassis_capability_item_json, "enabled", + json_boolean_create(port->p_chassis->c_cap_enabled & + LLDP_CAP_STATION)); + json_array_add(chassis_capability_json, + chassis_capability_item_json); + } + json_object_put(chassis_sys_json, "capability", + chassis_capability_json); + + if (port->p_id_subtype == LLDP_PORTID_SUBTYPE_LLADDR) { + ds_init(&id); + if (port->p_id_len > 0) { + ds_put_hex_with_delimiter(&id, port->p_id, port->p_id_len, + ":"); + } + json_object_put(port_id_json, "type", + json_string_create("mac")); + json_object_put(port_id_json, "value", + json_string_create(id.length ? ds_cstr_ro(&id) + : none_str)); + + ds_destroy(&id); + } else { + json_object_put(port_id_json, "type", + json_string_create("ifname")); + if (port->p_id) { + struct ds port_ds = DS_EMPTY_INITIALIZER; + ds_put_buffer(&port_ds, port->p_id, port->p_id_len); + json_object_put(port_id_json, "value", + json_string_create(ds_cstr_ro(&port_ds))); + ds_destroy(&port_ds); + } else { + json_object_put(port_id_json, "value", + json_string_create(none_str)); + } + } + json_object_put(port_json, "id", port_id_json); + + json_object_put(port_json, "desc", + json_string_create(strlen(port->p_descr) + ? port->p_descr + : none_str)); + json_object_put(port_json, "ttl", + json_integer_create(port->p_chassis->c_ttl)); + + json_object_put(interface_item_json, "chassis", chassis_json); + json_object_put(interface_item_json, "port", port_json); + + json_object_put(interface_item_warp_json, lldp->name, + interface_item_json); + json_array_add(interface_array_json, interface_item_warp_json); + } + } +} + static void aa_unixctl_status(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED) @@ -368,6 +646,53 @@ aa_unixctl_statistics(struct unixctl_conn *conn, int argc OVS_UNUSED, unixctl_command_reply(conn, ds_cstr(&ds)); } +static void +lldp_unixctl_show_neighbor(struct unixctl_conn *conn, int argc, + const char *argv[], void *aux OVS_UNUSED) + OVS_EXCLUDED(mutex) +{ + struct lldp *lldp; + + if (unixctl_command_get_output_format(conn) == UNIXCTL_OUTPUT_FMT_JSON) { + struct json *lldp_json = json_object_create(); + struct json *interface_json = json_object_create(); + struct json *interface_array_json = json_array_create_empty(); + + ovs_mutex_lock(&mutex); + HMAP_FOR_EACH (lldp, hmap_node, all_lldps) { + if (argc > 1 && strcmp(argv[1], lldp->name)) { + continue; + } + lldp_print_neighbor_json(interface_array_json,lldp); + } + ovs_mutex_unlock(&mutex); + + json_object_put(interface_json, "interface", interface_array_json); + json_object_put(lldp_json, "lldp", interface_json); + + unixctl_command_reply_json(conn, lldp_json); + } else { + struct ds ds = DS_EMPTY_INITIALIZER; + + ds_put_format(&ds, "--------------------------------------------------" + "-----------------------------\nLLDP neighbor:\n" + "--------------------------------------------------" + "-----------------------------\n"); + + ovs_mutex_lock(&mutex); + HMAP_FOR_EACH (lldp, hmap_node, all_lldps) { + if (argc > 1 && strcmp(argv[1], lldp->name)) { + continue; + } + lldp_print_neighbor(&ds, lldp); + } + ovs_mutex_unlock(&mutex); + + unixctl_command_reply(conn, ds_cstr(&ds)); + ds_destroy(&ds); + } +} + /* An Auto Attach mapping was configured. Populate the corresponding * structures in the LLDP hardware. */ @@ -635,6 +960,8 @@ lldp_init(void) aa_unixctl_show_isid, NULL); unixctl_command_register("autoattach/statistics", "[bridge]", 0, 1, aa_unixctl_statistics, NULL); + unixctl_command_register("lldp/neighbor", "[interface]", 0, 1, + lldp_unixctl_show_neighbor, NULL); } /* Returns true if 'lldp' should process packets from 'flow'. Sets diff --git a/vswitchd/ovs-vswitchd.8.in b/vswitchd/ovs-vswitchd.8.in index 98e58951d..51b0a46b5 100644 --- a/vswitchd/ovs-vswitchd.8.in +++ b/vswitchd/ovs-vswitchd.8.in @@ -149,6 +149,10 @@ enabled. Force the fault status of the CFM module on \fIinterface\fR (or all interfaces if none is given) to be \fIstatus\fR. \fIstatus\fR can be "true", "false", or "normal" which reverts to the standard behavior. +.IP "\fBlldp/neighbor\fR [\fIinterface\fR]" +Displays detailed information about LLDP neighbors on \fIinterface\fR. +If \fIinterface\fR is not specified, then it displays detailed information +about all interfaces with LLDP enabled. .IP "\fBstp/tcn\fR [\fIbridge\fR]" Forces a topology change event on \fIbridge\fR if it's running STP. This may cause it to send Topology Change Notifications to its peers and flush