VOM: mroutes
[vpp.git] / extras / vom / vom / igmp_listen_cmds.cpp
index cdf0850..69e243d 100644 (file)
@@ -14,6 +14,7 @@
  */
 
 #include "vom/igmp_listen_cmds.hpp"
+#include "vom/api_types.hpp"
 
 DEFINE_VAPI_MSG_IDS_IGMP_API_JSON;
 
@@ -21,7 +22,7 @@ namespace VOM {
 namespace igmp_listen_cmds {
 listen_cmd::listen_cmd(HW::item<bool>& item,
                        const handle_t& itf,
-                       const boost::asio::ip::address& gaddr,
+                       const boost::asio::ip::address_v4& gaddr,
                        const igmp_listen::src_addrs_t& saddrs)
   : rpc_cmd(item)
   , m_itf(itf)
@@ -33,7 +34,8 @@ listen_cmd::listen_cmd(HW::item<bool>& item,
 bool
 listen_cmd::operator==(const listen_cmd& other) const
 {
-  return ((m_itf == other.m_itf) && (m_gaddr == other.m_gaddr));
+  return ((m_itf == other.m_itf) && (m_gaddr == other.m_gaddr) &&
+          (m_saddrs == other.m_saddrs));
 }
 
 rc_t
@@ -44,17 +46,24 @@ listen_cmd::issue(connection& con)
 
   auto& payload = req.get_request().get_payload();
   payload.group.sw_if_index = m_itf.value();
-  payload.group.filter = EXCLUDE;
-  to_bytes(m_gaddr.to_v4(), (u8*)&payload.group.gaddr);
-  auto addr = m_saddrs.cbegin();
-  u8 i = 0;
-  while (addr != m_saddrs.cend()) {
-    to_bytes(addr->to_v4(), (u8*)&payload.group.saddrs[i]);
-    addr++;
-    i++;
+  to_api(m_gaddr, payload.group.gaddr);
+
+  if (0 == size) {
+    // no sources => (*,G) join
+    payload.group.filter = EXCLUDE;
+    payload.group.n_srcs = 0;
+  } else {
+    // source => (S,G) join
+    payload.group.filter = INCLUDE;
+    u8 i = 0;
+
+    for (auto addr : m_saddrs) {
+      to_api(addr, payload.group.saddrs[i]);
+      i++;
+    }
+    payload.group.n_srcs = i;
   }
 
-  payload.group.n_srcs = i;
   VAPI_CALL(req.execute());
 
   return (wait());
@@ -77,7 +86,7 @@ listen_cmd::to_string() const
 
 unlisten_cmd::unlisten_cmd(HW::item<bool>& item,
                            const handle_t& itf,
-                           const boost::asio::ip::address& gaddr)
+                           const boost::asio::ip::address_v4& gaddr)
   : rpc_cmd(item)
   , m_itf(itf)
   , m_gaddr(gaddr)
@@ -99,7 +108,7 @@ unlisten_cmd::issue(connection& con)
   payload.group.sw_if_index = m_itf.value();
   payload.group.n_srcs = 0;
   payload.group.filter = INCLUDE;
-  to_bytes(m_gaddr.to_v4(), (u8*)&payload.group.gaddr);
+  to_api(m_gaddr, payload.group.gaddr);
 
   VAPI_CALL(req.execute());