diff options
-rw-r--r-- | extras/vom/vom/bridge_domain_cmds.hpp | 2 | ||||
-rw-r--r-- | extras/vom/vom/ip_unnumbered.cpp | 22 | ||||
-rw-r--r-- | extras/vom/vom/ip_unnumbered_cmds.cpp | 27 | ||||
-rw-r--r-- | extras/vom/vom/ip_unnumbered_cmds.hpp | 32 | ||||
-rw-r--r-- | src/vnet/ip/ip.api | 24 | ||||
-rw-r--r-- | src/vnet/ip/ip_api.c | 69 |
6 files changed, 173 insertions, 3 deletions
diff --git a/extras/vom/vom/bridge_domain_cmds.hpp b/extras/vom/vom/bridge_domain_cmds.hpp index 0216236d42c..3257d83dc75 100644 --- a/extras/vom/vom/bridge_domain_cmds.hpp +++ b/extras/vom/vom/bridge_domain_cmds.hpp @@ -101,7 +101,7 @@ public: }; /** - * A cmd class that Dumps all the IPv4 L3 configs + * A cmd class that Dumps all the bridge domains */ class dump_cmd : public VOM::dump_cmd<vapi::Bridge_domain_dump> { diff --git a/extras/vom/vom/ip_unnumbered.cpp b/extras/vom/vom/ip_unnumbered.cpp index caeeb419993..74a6edeceeb 100644 --- a/extras/vom/vom/ip_unnumbered.cpp +++ b/extras/vom/vom/ip_unnumbered.cpp @@ -117,7 +117,27 @@ ip_unnumbered::event_handler::handle_replay() void ip_unnumbered::event_handler::handle_populate(const client_db::key_t& key) { - // VPP provides no dump for IP unnumbered + std::shared_ptr<ip_unnumbered_cmds::dump_cmd> cmd = + std::make_shared<ip_unnumbered_cmds::dump_cmd>(); + + HW::enqueue(cmd); + HW::write(); + + for (auto& ip_record : *cmd) { + auto& payload = ip_record.get_payload(); + + VOM_LOG(log_level_t::DEBUG) << "ip-unnumbered dump: " + << " itf: " << payload.sw_if_index + << " ip: " << payload.ip_sw_if_index; + + std::shared_ptr<interface> itf = interface::find(payload.sw_if_index); + std::shared_ptr<interface> ip_itf = interface::find(payload.ip_sw_if_index); + + if (itf && ip_itf) { + ip_unnumbered ipun(*itf, *ip_itf); + OM::commit(key, ipun); + } + } } dependency_t diff --git a/extras/vom/vom/ip_unnumbered_cmds.cpp b/extras/vom/vom/ip_unnumbered_cmds.cpp index 4c1fcf6d465..fa7a1150cc4 100644 --- a/extras/vom/vom/ip_unnumbered_cmds.cpp +++ b/extras/vom/vom/ip_unnumbered_cmds.cpp @@ -105,6 +105,33 @@ unconfig_cmd::to_string() const return (s.str()); } +bool +dump_cmd::operator==(const dump_cmd& other) const +{ + return (true); +} + +rc_t +dump_cmd::issue(connection& con) +{ + m_dump.reset(new msg_t(con.ctx(), std::ref(*this))); + + auto& payload = m_dump->get_request().get_payload(); + payload.sw_if_index = ~0; + + VAPI_CALL(m_dump->execute()); + + wait(); + + return rc_t::OK; +} + +std::string +dump_cmd::to_string() const +{ + return ("ip-unnumbered-dump"); +} + }; // namespace ip_unnumbered_cmds }; // namespace VOM diff --git a/extras/vom/vom/ip_unnumbered_cmds.hpp b/extras/vom/vom/ip_unnumbered_cmds.hpp index 0bb70276e45..40030139b8c 100644 --- a/extras/vom/vom/ip_unnumbered_cmds.hpp +++ b/extras/vom/vom/ip_unnumbered_cmds.hpp @@ -16,6 +16,7 @@ #ifndef __VOM_IP_UNNUMBERED_CMDS_H__ #define __VOM_IP_UNNUMBERED_CMDS_H__ +#include "vom/dump_cmd.hpp" #include "vom/ip_unnumbered.hpp" #include "vom/rpc_cmd.hpp" @@ -100,6 +101,37 @@ private: const handle_t& m_l3_itf; }; +/** + * A cmd class that Dumps all the IP unnumbered interfaces + */ +class dump_cmd : public VOM::dump_cmd<vapi::Ip_unnumbered_dump> +{ +public: + /** + * Constructor + */ + dump_cmd() = default; + + /** + * Issue the command to VPP/HW + */ + rc_t issue(connection& con); + /** + * convert to string format for debug purposes + */ + std::string to_string() const; + + /** + * Comparison operator - only used for UT + */ + bool operator==(const dump_cmd& i) const; + +private: + /** + * HW reutrn code + */ + HW::item<bool> item; +}; }; // namespace ip_unnumbered_cmds }; // namespace VOM diff --git a/src/vnet/ip/ip.api b/src/vnet/ip/ip.api index d59297b1c20..7f4f030882d 100644 --- a/src/vnet/ip/ip.api +++ b/src/vnet/ip/ip.api @@ -19,7 +19,7 @@ called through a shared memory interface. */ -option version = "1.2.3"; +option version = "1.2.4"; import "vnet/fib/fib_types.api"; /** \brief Add / del table request @@ -525,6 +525,28 @@ define ip_address_dump u8 is_ipv6; }; +/** \brief IP unnumbered configurations + @param sw_if_index The interface that has unnumbered configuration + @param ip_sw_if_index The IP interface that it is unnnumbered to +*/ +define ip_unnumbered_details +{ + u32 client_index; + u32 context; + u32 sw_if_index; + u32 ip_sw_if_index; +}; + +/** \brief Dump IP unnumbered configurations + @param sw_if_index ~0 for all interfaces, else the interface desired +*/ +define ip_unnumbered_dump +{ + u32 client_index; + u32 context; + u32 sw_if_index; +}; + define ip_details { u32 sw_if_index; diff --git a/src/vnet/ip/ip_api.c b/src/vnet/ip/ip_api.c index d83577320ce..ce3ff79acfa 100644 --- a/src/vnet/ip/ip_api.c +++ b/src/vnet/ip/ip_api.c @@ -74,6 +74,7 @@ _(IP_NEIGHBOR_DUMP, ip_neighbor_dump) \ _(IP_MROUTE_ADD_DEL, ip_mroute_add_del) \ _(MFIB_SIGNAL_DUMP, mfib_signal_dump) \ _(IP_ADDRESS_DUMP, ip_address_dump) \ +_(IP_UNNUMBERED_DUMP, ip_unnumbered_dump) \ _(IP_DUMP, ip_dump) \ _(IP_NEIGHBOR_ADD_DEL, ip_neighbor_add_del) \ _(SET_ARP_NEIGHBOR_LIMIT, set_arp_neighbor_limit) \ @@ -1424,6 +1425,74 @@ vl_api_ip_address_dump_t_handler (vl_api_ip_address_dump_t * mp) } static void +send_ip_unnumbered_details (vpe_api_main_t * am, + vl_api_registration_t * reg, + u32 sw_if_index, u32 ip_sw_if_index, u32 context) +{ + vl_api_ip_unnumbered_details_t *mp; + + mp = vl_msg_api_alloc (sizeof (*mp)); + memset (mp, 0, sizeof (*mp)); + mp->_vl_msg_id = ntohs (VL_API_IP_UNNUMBERED_DETAILS); + + mp->context = context; + mp->sw_if_index = htonl (sw_if_index); + mp->ip_sw_if_index = htonl (ip_sw_if_index); + + vl_api_send_msg (reg, (u8 *) mp); +} + +static void +vl_api_ip_unnumbered_dump_t_handler (vl_api_ip_unnumbered_dump_t * mp) +{ + vnet_main_t *vnm = vnet_get_main (); + vnet_interface_main_t *im = &vnm->interface_main; + int rv __attribute__ ((unused)) = 0; + vpe_api_main_t *am = &vpe_api_main; + vl_api_registration_t *reg; + vnet_sw_interface_t *si; + u32 sw_if_index; + + sw_if_index = ntohl (mp->sw_if_index); + + reg = vl_api_client_index_to_registration (mp->client_index); + if (!reg) + return; + + if (~0 != sw_if_index) + { + VALIDATE_SW_IF_INDEX (mp); + + si = vnet_get_sw_interface (vnm, ntohl (mp->sw_if_index)); + + if (!(si->flags & VNET_SW_INTERFACE_FLAG_UNNUMBERED)) + { + send_ip_unnumbered_details (am, reg, + sw_if_index, + si->unnumbered_sw_if_index, + mp->context); + } + } + else + { + /* *INDENT-OFF* */ + pool_foreach (si, im->sw_interfaces, + ({ + if ((si->flags & VNET_SW_INTERFACE_FLAG_UNNUMBERED)) + { + send_ip_unnumbered_details(am, reg, + si->sw_if_index, + si->unnumbered_sw_if_index, + mp->context); + } + })); + /* *INDENT-ON* */ + } + + BAD_SW_IF_INDEX_LABEL; +} + +static void vl_api_ip_dump_t_handler (vl_api_ip_dump_t * mp) { vpe_api_main_t *am = &vpe_api_main; |