Fix "Old Style VLA" build warnings

Change-Id: I8d42f6ed58ec34298d41edcb3d783e7e9ded3eec
Signed-off-by: Juraj Sloboda <jsloboda@cisco.com>
diff --git a/src/vat/api_format.c b/src/vat/api_format.c
index 6472773..8be83ba 100644
--- a/src/vat/api_format.c
+++ b/src/vat/api_format.c
@@ -11460,6 +11460,7 @@
   mp->miss_next_index = ntohl (miss_next_index);
   mp->current_data_flag = ntohl (current_data_flag);
   mp->current_data_offset = ntohl (current_data_offset);
+  mp->mask_len = ntohl (vec_len (mask));
   clib_memcpy (mp->mask, mask, vec_len (mask));
 
   vec_free (mask);
@@ -12011,6 +12012,7 @@
   mp->advance = ntohl (advance);
   mp->action = action;
   mp->metadata = ntohl (metadata);
+  mp->match_len = ntohl (vec_len (match));
   clib_memcpy (mp->match, match, vec_len (match));
   vec_free (match);
 
diff --git a/src/vlibmemory/memclnt.api b/src/vlibmemory/memclnt.api
index 923df69..cc37c7c 100644
--- a/src/vlibmemory/memclnt.api
+++ b/src/vlibmemory/memclnt.api
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-option version = "1.0.0";
+option version = "2.0.0";
 
 /*
  * Define services not following the normal convetions here
@@ -91,7 +91,8 @@
     u8 multicast;
     u8 need_barrier_sync;
     u8 send_reply;
-    u8 data[0];
+    u32 data_len;
+    u8 data[data_len];
 };
 
 /*
diff --git a/src/vnet/classify/classify.api b/src/vnet/classify/classify.api
index 7320d5f..c5e81fd 100644
--- a/src/vnet/classify/classify.api
+++ b/src/vnet/classify/classify.api
@@ -13,7 +13,7 @@
  * limitations under the License.
  */
 
-option version = "1.0.0";
+option version = "2.0.0";
 
 /** \brief Add/Delete classification table request
     @param client_index - opaque cookie to identify the sender
@@ -37,7 +37,8 @@
             can be accessible by configuring current_data_offset to -14
             if there is no vlan tag.
             This is valid only if current_data_flag is set to 1.
-    @param mask[] - match mask
+    @param mask_len - length of match mask, should be equal to match_n_vectors * sizeof (u32x4)
+    @param mask - match mask
 */
 define classify_add_del_table
 {
@@ -54,7 +55,8 @@
   u32 miss_next_index;
   u32 current_data_flag;
   i32 current_data_offset;
-  u8 mask[0];
+  u32 mask_len;
+  u8 mask[mask_len];
 };
 
 /** \brief Add/Delete classification table response
@@ -97,7 +99,9 @@
     @param metadata - valid only if action != 0
            VRF id if action is 1 or 2.
            sr policy index if action is 3.
-    @param match[] - for add, match value for session, required
+    @param match_len - length of match, should be equal to skip_n_vectors plus match_n_vectors
+                       of target table times sizeof (u32x4)
+    @param match - for add, match value for session, required
 */
 autoreply define classify_add_del_session
 {
@@ -110,7 +114,8 @@
   i32 advance;
   u8 action;
   u32 metadata;
-  u8 match[0];
+  u32 match_len;
+  u8 match[match_len];
 };
 
 /** \brief Set/unset policer classify interface
diff --git a/src/vnet/classify/classify_api.c b/src/vnet/classify/classify_api.c
index 2cf79f3..6397b10 100644
--- a/src/vnet/classify/classify_api.c
+++ b/src/vnet/classify/classify_api.c
@@ -72,7 +72,8 @@
 _(next_table_index)                             \
 _(miss_next_index)                              \
 _(current_data_flag)                            \
-_(current_data_offset)
+_(current_data_offset)                          \
+_(mask_len)
 
 static void vl_api_classify_add_del_table_t_handler
   (vl_api_classify_add_del_table_t * mp)
@@ -90,6 +91,12 @@
   foreach_classify_add_del_table_field;
 #undef _
 
+  if (mask_len != match_n_vectors * sizeof (u32x4))
+    {
+      rv = VNET_API_ERROR_INVALID_VALUE;
+      goto out;
+    }
+
   /* The underlying API fails silently, on purpose, so check here */
   if (mp->is_add == 0)		/* delete */
     {
@@ -138,9 +145,10 @@
   vnet_classify_main_t *cm = &vnet_classify_main;
   vl_api_classify_add_del_session_reply_t *rmp;
   int rv;
-  u32 table_index, hit_next_index, opaque_index, metadata;
+  u32 table_index, hit_next_index, opaque_index, metadata, match_len;
   i32 advance;
   u8 action;
+  vnet_classify_table_t *t;
 
   table_index = ntohl (mp->table_index);
   hit_next_index = ntohl (mp->hit_next_index);
@@ -148,11 +156,27 @@
   advance = ntohl (mp->advance);
   action = mp->action;
   metadata = ntohl (mp->metadata);
+  match_len = ntohl (mp->match_len);
+
+  if (pool_is_free_index (cm->tables, table_index))
+    {
+      rv = VNET_API_ERROR_NO_SUCH_TABLE;
+      goto out;
+    }
+
+  t = pool_elt_at_index (cm->tables, table_index);
+
+  if (match_len != (t->skip_n_vectors + t->match_n_vectors) * sizeof (u32x4))
+    {
+      rv = VNET_API_ERROR_INVALID_VALUE;
+      goto out;
+    }
 
   rv = vnet_classify_add_del_session
     (cm, table_index, mp->match, hit_next_index, opaque_index,
      advance, action, metadata, mp->is_add);
 
+out:
   REPLY_MACRO (VL_API_CLASSIFY_ADD_DEL_SESSION_REPLY);
 }
 
diff --git a/src/vpp-api/lua/examples/example-classifier.lua b/src/vpp-api/lua/examples/example-classifier.lua
index b127075..9e13d82 100644
--- a/src/vpp-api/lua/examples/example-classifier.lua
+++ b/src/vpp-api/lua/examples/example-classifier.lua
@@ -40,6 +40,7 @@
   nbuckets = 32,
   skip_n_vectors = 0,
   match_n_vectors = 1,
+  mask_len = 16,
   mask = "\255\255\255\255\255\255\255\255" .. "\255\255\255\255\255\255\255\255"
 })
 print(vpp.dump(reply))
diff --git a/test/vpp_papi_provider.py b/test/vpp_papi_provider.py
index 50a94d7..14cb727 100644
--- a/test/vpp_papi_provider.py
+++ b/test/vpp_papi_provider.py
@@ -2230,6 +2230,8 @@
         :param current_data_offset:  (Default value = 0)
         """
 
+        mask_len = ((len(mask) - 1) / 16 + 1) * 16
+        mask = mask + '\0' * (mask_len - len(mask))
         return self.api(
             self.papi.classify_add_del_table,
             {'is_add': is_add,
@@ -2242,6 +2244,7 @@
              'miss_next_index': miss_next_index,
              'current_data_flag': current_data_flag,
              'current_data_offset': current_data_offset,
+             'mask_len': mask_len,
              'mask': mask})
 
     def classify_add_del_session(
@@ -2265,6 +2268,8 @@
         :param metadata:  (Default value = 0)
         """
 
+        match_len = ((len(match) - 1) / 16 + 1) * 16
+        match = match + '\0' * (match_len - len(match))
         return self.api(
             self.papi.classify_add_del_session,
             {'is_add': is_add,
@@ -2274,6 +2279,7 @@
              'advance': advance,
              'action': action,
              'metadata': metadata,
+             'match_len': match_len,
              'match': match})
 
     def input_acl_set_interface(