summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJuraj Sloboda <jsloboda@cisco.com>2018-06-12 14:20:49 +0200
committerOle Trøan <otroan@employees.org>2018-08-09 07:34:25 +0000
commit7528245795947a7340d3537c6989c0f6a05933f4 (patch)
tree53ea00ccfbcff9d4f543bb215a391f87aaf2e405
parent40e6bdfff72fda7c0c51648686812f34fe8024ed (diff)
Fix "Old Style VLA" build warnings
Change-Id: I8d42f6ed58ec34298d41edcb3d783e7e9ded3eec Signed-off-by: Juraj Sloboda <jsloboda@cisco.com>
-rw-r--r--src/vat/api_format.c2
-rw-r--r--src/vlibmemory/memclnt.api5
-rw-r--r--src/vnet/classify/classify.api15
-rw-r--r--src/vnet/classify/classify_api.c28
-rw-r--r--src/vpp-api/lua/examples/example-classifier.lua1
-rw-r--r--test/vpp_papi_provider.py6
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(
t .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */ }
# Copyright (c) 2019 Cisco and/or its affiliates.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at:
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

*** Settings ***
| Resource | resources/libraries/robot/shared/default.robot
|
| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDR
| ... | NIC_Intel-X710 | ETH | L2BDMACLRN | FEATURE | ACL | ACL_STATEFUL
| ... | OACL | ACL50 | 100K_FLOWS | DRV_VFIO_PCI
|
| Suite Setup | Setup suite single link | performance
| Suite Teardown | Tear down suite | performance
| Test Setup | Setup test
| Test Teardown | Tear down test | performance | acl
|
| Test Template | Local Template
|
| Documentation | *RFC2544: Packet throughput L2BD test cases with ACL*
|
| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
| ... | with single links between nodes.
| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-UDP for L2 switching of IPv4.
| ... | *[Cfg] DUT configuration:* DUT1 is configured with L2 bridge domain\
| ... | and MAC learning enabled. DUT2 is configured with L2 cross-connects.\
| ... | Required ACL rules are applied to input paths of both DUT1 intefaces.\
| ... | DUT1 and DUT2 are tested with ${nic_name}.\
| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop\
| ... | Rate) with zero packet loss tolerance and throughput PDR (Partial Drop\
| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage\
| ... | of packets transmitted. NDR and PDR are discovered for different\
| ... | Ethernet L2 frame sizes using MLRsearch library.\
| ... | Test packets are generated by TG on\
| ... | links to DUTs. TG traffic profile contains two L3 flow-groups\
| ... | (flow-group per direction, ${flows_per_dir} flows per flow-group) with\
| ... | all packets containing Ethernet header, IPv4 header with UDP header and\
| ... | static payload. MAC addresses are matching MAC addresses of the TG node\
| ... | interfaces.
| ... | *[Ref] Applicable standard specifications:* RFC2544.

*** Variables ***
| @{plugins_to_enable}= | dpdk_plugin.so | acl_plugin.so
| ${crypto_type}= | ${None}
| ${nic_name}= | Intel-X710
| ${nic_driver}= | vfio-pci
| ${osi_layer}= | L2
| ${overhead}= | ${0}
# ACL test setup
| ${acl_action}= | permit+reflect
| ${acl_apply_type}= | output
| ${no_hit_aces_number}= | 50
| ${flows_per_dir}= | 100k
# starting points for non-hitting ACLs
| ${src_ip_start}= | 30.30.30.1
| ${dst_ip_start}= | 40.40.40.1
| ${ip_step}= | ${1}
| ${sport_start}= | ${1000}
| ${dport_start}= | ${1000}
| ${port_step}= | ${1}
| ${trex_stream1_subnet}= | 10.10.10.0/24
| ${trex_stream2_subnet}= | 20.20.20.0/24
# Traffic profile:
| ${traffic_profile}= | trex-sl-3n-ethip4udp-100u1000p-conc

*** Keywords ***
| Local Template
| | [Documentation]
| | ... | [Cfg] DUT runs IPv4 routing config.
| | ... | Each DUT uses ${phy_cores} physical core(s) for worker threads.
| | ... | [Ver] Measure NDR and PDR values using MLRsearch algorithm.\
| |
| | ... | *Arguments:*
| | ... | - frame_size - Framesize in Bytes in integer or string (IMIX_v4_1).
| | ... | Type: integer, string
| | ... | - phy_cores - Number of physical cores. Type: integer
| | ... | - rxq - Number of RX queues, default value: ${None}. Type: integer
| |
| | [Arguments] | ${frame_size} | ${phy_cores} | ${rxq}=${None}
| |
| | Set Test Variable | \${frame_size}
| |
| | Given Set Max Rate And Jumbo
| | And Add worker threads to all DUTs | ${phy_cores} | ${rxq}
| | And Pre-initialize layer driver | ${nic_driver}
| | And Apply Startup configuration on all VPP DUTs
| | When Initialize layer driver | ${nic_driver}
| | And Initialize layer interface
| | And Initialize L2 bridge domain with IPv4 ACLs on DUT1 in 3-node circular topology
| | Then Find NDR and PDR intervals using optimized search

*** Test Cases ***
| tc01-64B-1c-eth-l2bdbasemaclrn-oacl50sf-100kflows-ndrpdr
| | [Tags] | 64B | 1C
| | frame_size=${64} | phy_cores=${1}

| tc02-64B-2c-eth-l2bdbasemaclrn-oacl50sf-100kflows-ndrpdr
| | [Tags] | 64B | 2C
| | frame_size=${64} | phy_cores=${2}

| tc03-64B-4c-eth-l2bdbasemaclrn-oacl50sf-100kflows-ndrpdr
| | [Tags] | 64B | 4C
| | frame_size=${64} | phy_cores=${4}

| tc04-1518B-1c-eth-l2bdbasemaclrn-oacl50sf-100kflows-ndrpdr
| | [Tags] | 1518B | 1C
| | frame_size=${1518} | phy_cores=${1}

| tc05-1518B-2c-eth-l2bdbasemaclrn-oacl50sf-100kflows-ndrpdr
| | [Tags] | 1518B | 2C
| | frame_size=${1518} | phy_cores=${2}

| tc06-1518B-4c-eth-l2bdbasemaclrn-oacl50sf-100kflows-ndrpdr
| | [Tags] | 1518B | 4C
| | frame_size=${1518} | phy_cores=${4}

| tc07-9000B-1c-eth-l2bdbasemaclrn-oacl50sf-100kflows-ndrpdr
| | [Tags] | 9000B | 1C
| | frame_size=${9000} | phy_cores=${1}

| tc08-9000B-2c-eth-l2bdbasemaclrn-oacl50sf-100kflows-ndrpdr
| | [Tags] | 9000B | 2C
| | frame_size=${9000} | phy_cores=${2}

| tc09-9000B-4c-eth-l2bdbasemaclrn-oacl50sf-100kflows-ndrpdr
| | [Tags] | 9000B | 4C
| | frame_size=${9000} | phy_cores=${4}

| tc10-IMIX-1c-eth-l2bdbasemaclrn-oacl50sf-100kflows-ndrpdr
| | [Tags] | IMIX | 1C
| | frame_size=IMIX_v4_1 | phy_cores=${1}

| tc11-IMIX-2c-eth-l2bdbasemaclrn-oacl50sf-100kflows-ndrpdr
| | [Tags] | IMIX | 2C
| | frame_size=IMIX_v4_1 | phy_cores=${2}

| tc12-IMIX-4c-eth-l2bdbasemaclrn-oacl50sf-100kflows-ndrpdr
| | [Tags] | IMIX | 4C
| | frame_size=IMIX_v4_1 | phy_cores=${4}