vxlan: vxlan/vxlan.api API cleanup
[vpp.git] / extras / vom / vom / gbp_contract_cmds.cpp
index 9e8a177..1bb06bd 100644 (file)
 namespace VOM {
 namespace gbp_contract_cmds {
 
-create_cmd::create_cmd(HW::item<bool>& item,
+create_cmd::create_cmd(HW::item<uint32_t>& item,
+                       scope_t scope,
                        sclass_t sclass,
                        sclass_t dclass,
                        const handle_t& acl,
                        const gbp_contract::gbp_rules_t& gbp_rules,
                        const gbp_contract::ethertype_set_t& allowed_ethertypes)
   : rpc_cmd(item)
+  , m_scope(scope)
   , m_sclass(sclass)
   , m_dclass(dclass)
   , m_acl(acl)
@@ -38,27 +40,38 @@ bool
 create_cmd::operator==(const create_cmd& other) const
 {
   return ((m_acl == other.m_acl) && (m_sclass == other.m_sclass) &&
-          (m_dclass == other.m_dclass) && (m_gbp_rules == other.m_gbp_rules) &&
+          (m_scope == other.m_scope) && (m_dclass == other.m_dclass) &&
+          (m_gbp_rules == other.m_gbp_rules) &&
           (m_allowed_ethertypes == other.m_allowed_ethertypes));
 }
 
+#define ARRAY_LEN(x) (sizeof(x) / sizeof(x[0]))
+
 rc_t
 create_cmd::issue(connection& con)
 {
   size_t n_rules = m_gbp_rules.size();
-  size_t n_et_rules = 0;
+  uint32_t ii = 0;
 
-  msg_t req(con.ctx(), n_rules, n_et_rules, std::ref(*this));
+  msg_t req(con.ctx(), n_rules, std::ref(*this));
 
   auto& payload = req.get_request().get_payload();
   payload.is_add = 1;
   payload.contract.acl_index = m_acl.value();
+  payload.contract.scope = m_scope;
   payload.contract.sclass = m_sclass;
   payload.contract.dclass = m_dclass;
-
-  uint32_t ii = 0;
   payload.contract.n_rules = n_rules;
+  payload.contract.n_ether_types = m_allowed_ethertypes.size();
+
+  for (auto tt : m_allowed_ethertypes) {
+    payload.contract.allowed_ethertypes[ii] = tt.value();
+    ii++;
+    if (ii == ARRAY_LEN(payload.contract.allowed_ethertypes))
+      break;
+  }
 
+  ii = 0;
   for (auto rule : m_gbp_rules) {
     if (rule.action() == gbp_rule::action_t::REDIRECT)
       payload.contract.rules[ii].action = GBP_API_RULE_REDIRECT;
@@ -88,19 +101,6 @@ create_cmd::issue(connection& con)
     ++ii;
   }
 
-  u8* data;
-  u16* et;
-
-  data = (((u8*)&payload.contract.n_ether_types) +
-          (sizeof(payload.contract.rules[0]) * payload.contract.n_rules));
-  *data = m_allowed_ethertypes.size();
-  et = (u16*)(++data);
-  ii = 0;
-  for (auto tt : m_allowed_ethertypes) {
-    et[ii] = tt.value();
-    ii++;
-  }
-
   VAPI_CALL(req.execute());
 
   return (wait());
@@ -120,8 +120,12 @@ create_cmd::to_string() const
   return (s.str());
 }
 
-delete_cmd::delete_cmd(HW::item<bool>& item, sclass_t sclass, sclass_t dclass)
+delete_cmd::delete_cmd(HW::item<uint32_t>& item,
+                       scope_t scope,
+                       sclass_t sclass,
+                       sclass_t dclass)
   : rpc_cmd(item)
+  , m_scope(scope)
   , m_sclass(sclass)
   , m_dclass(dclass)
 {
@@ -136,11 +140,12 @@ delete_cmd::operator==(const delete_cmd& other) const
 rc_t
 delete_cmd::issue(connection& con)
 {
-  msg_t req(con.ctx(), 0, 0, std::ref(*this));
+  msg_t req(con.ctx(), 0, std::ref(*this));
 
   auto& payload = req.get_request().get_payload();
   payload.is_add = 0;
   payload.contract.acl_index = ~0;
+  payload.contract.scope = m_scope;
   payload.contract.sclass = m_sclass;
   payload.contract.dclass = m_dclass;
 
@@ -153,8 +158,8 @@ std::string
 delete_cmd::to_string() const
 {
   std::ostringstream s;
-  s << "gbp-contract-delete: " << m_hw_item.to_string()
-    << " src-epg-id:" << m_sclass << " dst-epg-id:" << m_dclass;
+  s << "gbp-contract-delete: " << m_hw_item.to_string() << " scope: " << m_scope
+    << " sclass:" << m_sclass << " dclass:" << m_dclass;
 
   return (s.str());
 }