From 9f8d3b9b2fd3ec7c0b43ebd0d3b413e859073a1b Mon Sep 17 00:00:00 2001 From: Denys Haryachyy Date: Fri, 17 Nov 2023 11:57:18 +0200 Subject: lldp: dump api Introduce a dump api for LLDP plugin Type: improvement Signed-off-by: Stanislav Zaikin Change-Id: If67dedd329cced59227187284646d147ef6ef92c --- src/plugins/lldp/lldp.api | 76 ++++++++++++++++++++++++++++++++++++++++++++ src/plugins/lldp/lldp_api.c | 53 ++++++++++++++++++++++++------ src/plugins/lldp/lldp_test.c | 12 +++++++ 3 files changed, 132 insertions(+), 9 deletions(-) diff --git a/src/plugins/lldp/lldp.api b/src/plugins/lldp/lldp.api index 6be060b0dd1..c5edee7cf39 100644 --- a/src/plugins/lldp/lldp.api +++ b/src/plugins/lldp/lldp.api @@ -56,3 +56,79 @@ autoreply define sw_interface_set_lldp bool enable [default=true]; string port_desc[]; }; + +/** \brief Dump lldp neighbors + @param client_index - opaque cookie to identify the sender + @param context - sender context, to match reply w/ request +*/ +autoendian define lldp_dump +{ + u32 client_index; + u32 context; + u32 cursor; +}; + +autoendian define lldp_dump_reply +{ + u32 context; + i32 retval; + u32 cursor; +}; + +enum port_id_subtype +{ + PORT_ID_SUBTYPE_RESERVED = 0x00, + PORT_ID_SUBTYPE_INTF_ALIAS = 0x01, + PORT_ID_SUBTYPE_PORT_COMP = 0x02, + PORT_ID_SUBTYPE_MAC_ADDR = 0x03, + PORT_ID_SUBTYPE_NET_ADDR = 0x04, + PORT_ID_SUBTYPE_INTF_NAME = 0x05, + PORT_ID_SUBTYPE_AGENT_CIRCUIT_ID = 0x06, + PORT_ID_SUBTYPE_LOCAL = 0x07, +}; + +enum chassis_id_subtype +{ + CHASSIS_ID_SUBTYPE_RESERVED = 0x00, + CHASSIS_ID_SUBTYPE_CHASSIS_COMP = 0x01, + CHASSIS_ID_SUBTYPE_INTF_ALIAS = 0x02, + CHASSIS_ID_SUBTYPE_PORT_COMP = 0x03, + CHASSIS_ID_SUBTYPE_MAC_ADDR = 0x04, + CHASSIS_ID_SUBTYPE_NET_ADDR = 0x05, + CHASSIS_ID_SUBTYPE_INTF_NAME = 0x06, + CHASSIS_ID_SUBTYPE_LOCAL = 0x07, +}; + +/** \brief Details about neighbor + @param context - returned sender context, to match reply w/ request + @param sw_if_index - interface where neighbor was discovered + @param last_heard - last heard time + @param last_sent - last sent time + @param chassis_id - chassis id value + @param chassis_id_len - length for chassis id + @param port_id - port id value + @param port_id_len - length for port id + @param ttl - time to length for the neighbour + @param port_id_subtype - subtype for port_id + @param chassis_id_sybtype - sybtype for chassis_id +*/ +autoendian define lldp_details +{ + u32 context; + vl_api_interface_index_t sw_if_index; + f64 last_heard; + f64 last_sent; + u8 chassis_id[64]; + u8 chassis_id_len; + u8 port_id[64]; + u8 port_id_len; + u16 ttl; + vl_api_port_id_subtype_t port_id_subtype; + vl_api_chassis_id_subtype_t chassis_id_subtype; + option status="in_progress"; +}; + +service { + rpc lldp_dump returns lldp_dump_reply + stream lldp_details; +}; diff --git a/src/plugins/lldp/lldp_api.c b/src/plugins/lldp/lldp_api.c index aab6b592655..6d3f6d7e761 100644 --- a/src/plugins/lldp/lldp_api.c +++ b/src/plugins/lldp/lldp_api.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -42,7 +43,7 @@ static u32 lldp_base_msg_id; #include static void -vl_api_lldp_config_t_handler (vl_api_lldp_config_t * mp) +vl_api_lldp_config_t_handler (vl_api_lldp_config_t *mp) { vl_api_lldp_config_reply_t *rmp; int rv = 0; @@ -50,8 +51,8 @@ vl_api_lldp_config_t_handler (vl_api_lldp_config_t * mp) sys_name = vl_api_from_api_to_new_vec (mp, &mp->system_name); - if (lldp_cfg_set (&sys_name, ntohl (mp->tx_hold), ntohl (mp->tx_interval)) - != lldp_ok) + if (lldp_cfg_set (&sys_name, ntohl (mp->tx_hold), ntohl (mp->tx_interval)) != + lldp_ok) { vec_free (sys_name); rv = VNET_API_ERROR_INVALID_VALUE; @@ -61,7 +62,7 @@ vl_api_lldp_config_t_handler (vl_api_lldp_config_t * mp) } static void -vl_api_sw_interface_set_lldp_t_handler (vl_api_sw_interface_set_lldp_t * mp) +vl_api_sw_interface_set_lldp_t_handler (vl_api_sw_interface_set_lldp_t *mp) { vl_api_sw_interface_set_lldp_reply_t *rmp; int rv = 0; @@ -100,7 +101,7 @@ vl_api_sw_interface_set_lldp_t_handler (vl_api_sw_interface_set_lldp_t * mp) VALIDATE_SW_IF_INDEX (mp); - if (lldp_cfg_intf_set (ntohl (mp->sw_if_index), (u8 **) & port_desc, + if (lldp_cfg_intf_set (ntohl (mp->sw_if_index), (u8 **) &port_desc, &mgmt_ip4, &mgmt_ip6, &mgmt_oid, mp->enable) != lldp_ok) { @@ -116,6 +117,41 @@ vl_api_sw_interface_set_lldp_t_handler (vl_api_sw_interface_set_lldp_t * mp) REPLY_MACRO (VL_API_SW_INTERFACE_SET_LLDP_REPLY); } +static void +send_lldp (u32 index, vl_api_registration_t *rp, u32 context) +{ + vl_api_lldp_details_t *rmp = 0; + vnet_main_t *vnm = &vnet_main; + lldp_main_t *lm = &lldp_main; + const lldp_intf_t *n = vec_elt_at_index (lm->intfs, index); + const vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, n->hw_if_index); + + REPLY_MACRO_DETAILS4_END ( + VL_API_LLDP_DETAILS, rp, context, ({ + rmp->sw_if_index = hw->sw_if_index; + rmp->last_heard = n->last_heard; + rmp->last_sent = n->last_sent; + rmp->ttl = n->ttl; + rmp->port_id_subtype = (vl_api_port_id_subtype_t) n->port_id_subtype; + rmp->chassis_id_subtype = + (vl_api_chassis_id_subtype_t) n->chassis_id_subtype; + rmp->chassis_id_len = vec_len (n->chassis_id); + clib_memcpy (&rmp->chassis_id, n->chassis_id, rmp->chassis_id_len); + rmp->port_id_len = vec_len (n->port_id); + clib_memcpy (&rmp->port_id, n->port_id, rmp->port_id_len); + })); +} + +static void +vl_api_lldp_dump_t_handler (vl_api_lldp_dump_t *mp) +{ + int rv = 0; + lldp_main_t *lm = &lldp_main; + vl_api_lldp_dump_reply_t *rmp; + + REPLY_AND_DETAILS_MACRO_END (VL_API_LLDP_DUMP_REPLY, lm->intfs, + ({ send_lldp (cursor, rp, mp->context); })); +} /* * * lldp_api_hookup @@ -127,7 +163,7 @@ vl_api_sw_interface_set_lldp_t_handler (vl_api_sw_interface_set_lldp_t * mp) #include static clib_error_t * -lldp_api_hookup (vlib_main_t * vm) +lldp_api_hookup (vlib_main_t *vm) { /* * Set up the (msg_name, crc, message-id) table @@ -144,12 +180,11 @@ VLIB_API_INIT_FUNCTION (lldp_api_hookup); /* *INDENT-OFF* */ VLIB_PLUGIN_REGISTER () = { - .version = VPP_BUILD_VER, - .description = "Link Layer Discovery Protocol (LLDP)", + .version = VPP_BUILD_VER, + .description = "Link Layer Discovery Protocol (LLDP)", }; /* *INDENT-ON* */ - /* * fd.io coding-style-patch-verification: ON * diff --git a/src/plugins/lldp/lldp_test.c b/src/plugins/lldp/lldp_test.c index 6eb3e0f0279..ba5ecb20260 100644 --- a/src/plugins/lldp/lldp_test.c +++ b/src/plugins/lldp/lldp_test.c @@ -142,4 +142,16 @@ api_sw_interface_set_lldp (vat_main_t * vam) return ret; } +static int +api_lldp_dump (vat_main_t *vam) +{ + return 0; +} + +static void +vl_api_lldp_dump_reply_t_handler (vl_api_lldp_dump_reply_t *mp) +{ + // not yet implemented +} + #include -- cgit 1.2.3-korg