diff options
-rw-r--r-- | src/vat/api_format.c | 2 | ||||
-rw-r--r-- | src/vlibmemory/memclnt.api | 5 | ||||
-rw-r--r-- | src/vnet/classify/classify.api | 15 | ||||
-rw-r--r-- | src/vnet/classify/classify_api.c | 28 | ||||
-rw-r--r-- | src/vpp-api/lua/examples/example-classifier.lua | 1 | ||||
-rw-r--r-- | test/vpp_papi_provider.py | 6 |
6 files changed, 48 insertions, 9 deletions
diff --git a/src/vat/api_format.c b/src/vat/api_format.c index 647277315e8..8be83ba7cae 100644 --- a/src/vat/api_format.c +++ b/src/vat/api_format.c @@ -11460,6 +11460,7 @@ api_classify_add_del_table (vat_main_t * vam) 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 @@ api_classify_add_del_session (vat_main_t * vam) 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 923df69fd9a..cc37c7c2f8d 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 @@ autoreply define rpc_call { 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 7320d5ffa90..c5e81fdd093 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 @@ option version = "1.0.0"; 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 @@ define classify_add_del_table 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 @@ define classify_add_del_table_reply @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 @@ autoreply define classify_add_del_session 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 2cf79f3875d..6397b10fbd6 100644 --- a/src/vnet/classify/classify_api.c +++ b/src/vnet/classify/classify_api.c @@ -72,7 +72,8 @@ _(match_n_vectors) \ _(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 @@ static void vl_api_classify_add_del_table_t_handler 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 @@ static void vl_api_classify_add_del_session_t_handler 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 @@ static void vl_api_classify_add_del_session_t_handler 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 b1270757550..9e13d82b98d 100644 --- a/src/vpp-api/lua/examples/example-classifier.lua +++ b/src/vpp-api/lua/examples/example-classifier.lua @@ -40,6 +40,7 @@ reply = vpp:api_call("classify_add_del_table", { 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 50a94d7431b..14cb72727b6 100644 --- a/test/vpp_papi_provider.py +++ b/test/vpp_papi_provider.py @@ -2230,6 +2230,8 @@ class VppPapiProvider(object): :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 @@ class VppPapiProvider(object): '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 @@ class VppPapiProvider(object): :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 @@ class VppPapiProvider(object): 'advance': advance, 'action': action, 'metadata': metadata, + 'match_len': match_len, 'match': match}) def input_acl_set_interface( |