ip: Protocol Independent IP Neighbors
[vpp.git] / extras / vom / vom / neighbour_cmds.cpp
index 2f3c200..d507bb7 100644 (file)
  */
 
 #include "vom/neighbour_cmds.hpp"
+#include "vom/api_types.hpp"
+
+DEFINE_VAPI_MSG_IDS_IP_NEIGHBOR_API_JSON;
 
 namespace VOM {
 namespace neighbour_cmds {
-create_cmd::create_cmd(HW::item<bool>& item,
+create_cmd::create_cmd(HW::item<handle_t>& item,
                        handle_t itf,
                        const mac_address_t& mac,
-                       const boost::asio::ip::address& ip_addr)
-  : rpc_cmd(item)
+                       const boost::asio::ip::address& ip_addr,
+                       const neighbour::flags_t& flags)
+  : srpc_cmd(item)
   , m_itf(itf)
   , m_mac(mac)
   , m_ip_addr(ip_addr)
-{
-}
+  , m_flags(flags)
+{}
 
 bool
 create_cmd::operator==(const create_cmd& other) const
 {
   return ((m_mac == other.m_mac) && (m_ip_addr == other.m_ip_addr) &&
-          (m_itf == other.m_itf));
+          (m_itf == other.m_itf) && (m_flags == other.m_flags));
 }
 
 rc_t
@@ -41,17 +45,16 @@ create_cmd::issue(connection& con)
   msg_t req(con.ctx(), std::ref(*this));
 
   auto& payload = req.get_request().get_payload();
-  payload.sw_if_index = m_itf.value();
   payload.is_add = 1;
-  payload.is_static = 1;
-  m_mac.to_bytes(payload.mac_address, 6);
-  to_bytes(m_ip_addr, &payload.is_ipv6, payload.dst_address);
+  payload.neighbor.sw_if_index = m_itf.value();
 
-  VAPI_CALL(req.execute());
+  to_api(m_mac, payload.neighbor.mac_address);
+  to_api(m_ip_addr, payload.neighbor.ip_address);
+  payload.neighbor.flags = to_api(m_flags);
 
-  m_hw_item.set(wait());
+  VAPI_CALL(req.execute());
 
-  return rc_t::OK;
+  return (wait());
 }
 
 std::string
@@ -65,16 +68,17 @@ create_cmd::to_string() const
   return (s.str());
 }
 
-delete_cmd::delete_cmd(HW::item<bool>& item,
+delete_cmd::delete_cmd(HW::item<handle_t>& item,
                        handle_t itf,
                        const mac_address_t& mac,
-                       const boost::asio::ip::address& ip_addr)
-  : rpc_cmd(item)
+                       const boost::asio::ip::address& ip_addr,
+                       const neighbour::flags_t& flags)
+  : srpc_cmd(item)
   , m_itf(itf)
   , m_mac(mac)
   , m_ip_addr(ip_addr)
-{
-}
+  , m_flags(flags)
+{}
 
 bool
 delete_cmd::operator==(const delete_cmd& other) const
@@ -89,11 +93,12 @@ delete_cmd::issue(connection& con)
   msg_t req(con.ctx(), std::ref(*this));
 
   auto& payload = req.get_request().get_payload();
-  payload.sw_if_index = m_itf.value();
   payload.is_add = 0;
-  payload.is_static = 1;
-  m_mac.to_bytes(payload.mac_address, 6);
-  to_bytes(m_ip_addr, &payload.is_ipv6, payload.dst_address);
+  payload.neighbor.sw_if_index = m_itf.value();
+
+  to_api(m_mac, payload.neighbor.mac_address);
+  to_api(m_ip_addr, payload.neighbor.ip_address);
+  payload.neighbor.flags = to_api(m_flags);
 
   VAPI_CALL(req.execute());
 
@@ -117,14 +122,12 @@ delete_cmd::to_string() const
 dump_cmd::dump_cmd(const handle_t& hdl, const l3_proto_t& proto)
   : m_itf(hdl)
   , m_proto(proto)
-{
-}
+{}
 
 dump_cmd::dump_cmd(const dump_cmd& d)
   : m_itf(d.m_itf)
   , m_proto(d.m_proto)
-{
-}
+{}
 
 bool
 dump_cmd::operator==(const dump_cmd& other) const
@@ -139,7 +142,7 @@ dump_cmd::issue(connection& con)
 
   auto& payload = m_dump->get_request().get_payload();
   payload.sw_if_index = m_itf.value();
-  payload.is_ipv6 = m_proto.is_ipv6();
+  payload.af = to_api(m_proto);
 
   VAPI_CALL(m_dump->execute());
 
@@ -151,7 +154,11 @@ dump_cmd::issue(connection& con)
 std::string
 dump_cmd::to_string() const
 {
-  return ("neighbour-dump");
+  std::ostringstream s;
+
+  s << "neighbour-dump: " << m_itf.to_string() << " " << m_proto.to_string();
+
+  return (s.str());
 }
 } // namespace neighbour_cmds
 } // namespace vom