From 57b8e6f6a43efdd252fe4cdaaf9d93178c76f620 Mon Sep 17 00:00:00 2001 From: Nikola Dancejic Date: Tue, 14 May 2024 18:23:55 +0000 Subject: [PATCH] [syncd] Enable bulk api for neighbor entries SAI 1.11.0 added support for bulk neighbor entries. Adding support for neighbor bulk operations to syncd. * added neighbor entry capability to bulk operations in syncd * added unit tests for neighbor bulk operations * added code coverage for neighbor bulk operations Signed-off-by: Nikola Dancejic --- SAI | 2 +- configure.ac | 5 --- saiplayer/SaiPlayer.cpp | 52 ++++++++++++++++++++++++ syncd/Syncd.cpp | 4 ++ syncd/tests.cpp | 2 + tests/BCM56850.pl | 8 ++++ tests/BCM56850/bulk_neighbor.rec | 12 ++++++ unittest/lib/test_sai_redis_neighbor.cpp | 5 +++ unittest/vslib/test_sai_vs_neighbor.cpp | 5 +++ 9 files changed, 89 insertions(+), 6 deletions(-) create mode 100644 tests/BCM56850/bulk_neighbor.rec diff --git a/SAI b/SAI index 2587c3b89..bc1d6ec90 160000 --- a/SAI +++ b/SAI @@ -1 +1 @@ -Subproject commit 2587c3b89241022bb0eef3ef82ab764eda7a183c +Subproject commit bc1d6ec90fb462c5171dbaa1aedcab1aac890ce9 diff --git a/configure.ac b/configure.ac index 4c601e0fe..9c6ade715 100644 --- a/configure.ac +++ b/configure.ac @@ -12,7 +12,6 @@ AC_PROG_LIBTOOL AC_HEADER_STDC AM_PATH_PYTHON3 AX_PYTHON3_DEVEL -AX_CODE_COVERAGE AX_ADD_AM_MACRO_STATIC([]) AM_CONDITIONAL(SONIC_ASIC_PLATFORM_BAREFOOT, test x$CONFIGURED_PLATFORM = xbarefoot) @@ -29,10 +28,6 @@ AM_CONDITIONAL(DEBUG, test x$debug = xtrue) AM_COND_IF([DEBUG], AC_SUBST(DBGFLAGS, "-ggdb -DDEBUG"), AC_SUBST(DBGFLAGS, "-g")) -AM_COND_IF([DEBUG], - [AM_COND_IF([CODE_COVERAGE_ENABLED], - AC_MSG_ERROR("Flag conflict --enable-debug 'DEBUG' and --enable-code-coverage 'NDEBUG'"))]) - AC_ARG_WITH(sai, [ --with-sai=vs compiling against specific SAI], [case "${withval}" in diff --git a/saiplayer/SaiPlayer.cpp b/saiplayer/SaiPlayer.cpp index 29723edc4..598416def 100644 --- a/saiplayer/SaiPlayer.cpp +++ b/saiplayer/SaiPlayer.cpp @@ -1698,6 +1698,23 @@ sai_status_t SaiPlayer::handle_bulk_entry( } break; + case SAI_OBJECT_TYPE_NEIGHBOR_ENTRY: + { + std::vector entries(object_count); + + for (size_t it = 0; it < object_count; it++) + { + sai_deserialize_neighbor_entry(object_ids[it], entries[it]); + + entries[it].switch_id = translate_local_to_redis(entries[it].switch_id); + entries[it].rif_id = translate_local_to_redis(entries[it].rif_id); + } + + CALL_BULK_CREATE_API_WITH_TIMER("neighbor_entry"); + + } + break; + case SAI_OBJECT_TYPE_FDB_ENTRY: { @@ -1876,6 +1893,23 @@ sai_status_t SaiPlayer::handle_bulk_entry( } break; + case SAI_OBJECT_TYPE_NEIGHBOR_ENTRY: + { + std::vector entries(object_count); + + for (size_t it = 0; it < object_count; it++) + { + sai_deserialize_neighbor_entry(object_ids[it], entries[it]); + + entries[it].switch_id = translate_local_to_redis(entries[it].switch_id); + entries[it].rif_id = translate_local_to_redis(entries[it].rif_id); + } + + CALL_BULK_REMOVE_API_WITH_TIMER("neighbor_entry"); + + } + break; + case SAI_OBJECT_TYPE_FDB_ENTRY: { @@ -2061,6 +2095,23 @@ sai_status_t SaiPlayer::handle_bulk_entry( } break; + case SAI_OBJECT_TYPE_NEIGHBOR_ENTRY: + { + std::vector entries(object_count); + + for (size_t it = 0; it < object_count; it++) + { + sai_deserialize_neighbor_entry(object_ids[it], entries[it]); + + entries[it].switch_id = translate_local_to_redis(entries[it].switch_id); + entries[it].rif_id = translate_local_to_redis(entries[it].rif_id); + } + + CALL_BULK_SET_API_WITH_TIMER("neighbor_entry"); + + } + break; + case SAI_OBJECT_TYPE_FDB_ENTRY: { @@ -2452,6 +2503,7 @@ void SaiPlayer::processBulk( switch ((int)object_type) { case SAI_OBJECT_TYPE_ROUTE_ENTRY: + case SAI_OBJECT_TYPE_NEIGHBOR_ENTRY: case SAI_OBJECT_TYPE_FDB_ENTRY: case SAI_OBJECT_TYPE_NAT_ENTRY: case SAI_OBJECT_TYPE_DIRECTION_LOOKUP_ENTRY: diff --git a/syncd/Syncd.cpp b/syncd/Syncd.cpp index fcd8f696d..508dadea1 100644 --- a/syncd/Syncd.cpp +++ b/syncd/Syncd.cpp @@ -1790,6 +1790,10 @@ sai_status_t Syncd::processBulkEntry( sai_deserialize_route_entry(objectIds[idx], metaKey.objectkey.key.route_entry); break; + case SAI_OBJECT_TYPE_NEIGHBOR_ENTRY: + sai_deserialize_neighbor_entry(objectIds[idx], metaKey.objectkey.key.neighbor_entry); + break; + case SAI_OBJECT_TYPE_NAT_ENTRY: sai_deserialize_nat_entry(objectIds[idx], metaKey.objectkey.key.nat_entry); break; diff --git a/syncd/tests.cpp b/syncd/tests.cpp index 6c46835e6..7ec6c8fc0 100644 --- a/syncd/tests.cpp +++ b/syncd/tests.cpp @@ -908,6 +908,8 @@ int main() test_bulk_fdb_create(); + test_bulk_neighbor_set(); + test_bulk_route_set(); sai_api_uninitialize(); diff --git a/tests/BCM56850.pl b/tests/BCM56850.pl index 5127757c7..7dd6ea0a8 100755 --- a/tests/BCM56850.pl +++ b/tests/BCM56850.pl @@ -580,6 +580,13 @@ sub test_bulk_route play "bulk_route.rec" } +sub test_bulk_neighbor +{ + fresh_start; + + play "bulk_neighbor.rec" +} + sub test_bulk_fdb { fresh_start; @@ -862,6 +869,7 @@ sub test_acl_pre_match_999 test_acl_mask; test_empty_lag_buffer_acl; test_bulk_route; +test_bulk_neighbor; test_bulk_fdb; test_bulk_object; test_brcm_config_acl; diff --git a/tests/BCM56850/bulk_neighbor.rec b/tests/BCM56850/bulk_neighbor.rec new file mode 100644 index 000000000..4d0887031 --- /dev/null +++ b/tests/BCM56850/bulk_neighbor.rec @@ -0,0 +1,12 @@ +2024-05-22.01:55:46.541806|#|recording on: ./sairedis.2024-05-22.01:55:46.541389.rec +2024-05-22.01:55:46.543987|a|INIT_VIEW +2024-05-22.01:55:46.551164|A|SAI_STATUS_SUCCESS +2024-05-22.01:55:46.555975|c|SAI_OBJECT_TYPE_SWITCH:oid:0x21000000000000|SAI_SWITCH_ATTR_INIT_SWITCH=true|SAI_SWITCH_ATTR_FDB_EVENT_NOTIFY=0x417890|SAI_SWITCH_ATTR_PORT_STATE_CHANGE_NOTIFY=0x4179f0|SAI_SWITCH_ATTR_SWITCH_SHUTDOWN_REQUEST_NOTIFY=0x417b50 +2024-05-22.01:56:05.508992|c|SAI_OBJECT_TYPE_VIRTUAL_ROUTER:oid:0x3000000000004 +2024-05-22.01:56:05.708992|c|SAI_OBJECT_TYPE_PORT:oid:0x20000000006ee|SAI_PORT_ATTR_SPEED=10000|SAI_PORT_ATTR_HW_LANE_LIST=1:202 +2024-05-22.01:56:05.805336|c|SAI_OBJECT_TYPE_ROUTER_INTERFACE:oid:0x6000000000727|SAI_ROUTER_INTERFACE_ATTR_VIRTUAL_ROUTER_ID=oid:0x3000000000004|SAI_ROUTER_INTERFACE_ATTR_SRC_MAC_ADDRESS=00:E0:EC:C2:AF:7A|SAI_ROUTER_INTERFACE_ATTR_TYPE=SAI_ROUTER_INTERFACE_TYPE_PORT|SAI_ROUTER_INTERFACE_ATTR_PORT_ID=oid:0x20000000006ee|SAI_ROUTER_INTERFACE_ATTR_MTU=9100|SAI_ROUTER_INTERFACE_ATTR_NAT_ZONE_ID=0 +2024-05-22.01:56:06.105336|C|SAI_OBJECT_TYPE_NEIGHBOR_ENTRY||{"ip":"10.0.0.57","rif":"oid:0x6000000000727","switch_id":"oid:0x21000000000000"}|SAI_NEIGHBOR_ENTRY_ATTR_DST_MAC_ADDRESS=FF:FF:FF:FF:FF:FF||{"ip":"10.0.0.59","rif":"oid:0x6000000000727","switch_id":"oid:0x21000000000000"}|SAI_NEIGHBOR_ENTRY_ATTR_DST_MAC_ADDRESS=FF:FF:FF:FF:FF:FF +2024-05-22.01:56:06.205336|S|SAI_OBJECT_TYPE_NEIGHBOR_ENTRY||{"ip":"10.0.0.57","rif":"oid:0x6000000000727","switch_id":"oid:0x21000000000000"}|SAI_NEIGHBOR_ENTRY_ATTR_DST_MAC_ADDRESS=FF:FF:FF:FF:FF:00||{"ip":"10.0.0.59","rif":"oid:0x6000000000727","switch_id":"oid:0x21000000000000"}|SAI_NEIGHBOR_ENTRY_ATTR_DST_MAC_ADDRESS=FF:FF:FF:FF:FF:00 +2024-05-22.01:56:06.205336|R|SAI_OBJECT_TYPE_NEIGHBOR_ENTRY||{"ip":"10.0.0.57","rif":"oid:0x6000000000727","switch_id":"oid:0x21000000000000"}||{"ip":"10.0.0.59","rif":"oid:0x6000000000727","switch_id":"oid:0x21000000000000"} +2024-05-22.01:56:06.151337|a|APPLY_VIEW +2024-05-22.01:56:06.156740|A|SAI_STATUS_SUCCESS \ No newline at end of file diff --git a/unittest/lib/test_sai_redis_neighbor.cpp b/unittest/lib/test_sai_redis_neighbor.cpp index 2322873de..9a7852410 100644 --- a/unittest/lib/test_sai_redis_neighbor.cpp +++ b/unittest/lib/test_sai_redis_neighbor.cpp @@ -21,5 +21,10 @@ TEST(libsairedis, neighbor) EXPECT_NE(SAI_STATUS_SUCCESS, api->set_neighbor_entry_attribute(0,0)); EXPECT_NE(SAI_STATUS_SUCCESS, api->get_neighbor_entry_attribute(0,0,0)); + EXPECT_NE(SAI_STATUS_SUCCESS, api->create_neighbor_entries(0,0,0,0,SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR,0)); + EXPECT_NE(SAI_STATUS_SUCCESS, api->remove_neighbor_entries(0,0,SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR,0)); + EXPECT_NE(SAI_STATUS_SUCCESS, api->set_neighbor_entries_attribute(0,0,0,SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR,0)); + EXPECT_NE(SAI_STATUS_SUCCESS, api->get_neighbor_entries_attribute(0,0,0,0,SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR,0)); + EXPECT_EQ(SAI_STATUS_NOT_IMPLEMENTED, api->remove_all_neighbor_entries(0)); } diff --git a/unittest/vslib/test_sai_vs_neighbor.cpp b/unittest/vslib/test_sai_vs_neighbor.cpp index f5398762a..3ad85a077 100644 --- a/unittest/vslib/test_sai_vs_neighbor.cpp +++ b/unittest/vslib/test_sai_vs_neighbor.cpp @@ -21,5 +21,10 @@ TEST(libsaivs, neighbor) EXPECT_NE(SAI_STATUS_SUCCESS, api->set_neighbor_entry_attribute(0,0)); EXPECT_NE(SAI_STATUS_SUCCESS, api->get_neighbor_entry_attribute(0,0,0)); + EXPECT_NE(SAI_STATUS_SUCCESS, api->create_neighbor_entries(0,0,0,0,SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR,0)); + EXPECT_NE(SAI_STATUS_SUCCESS, api->remove_neighbor_entries(0,0,SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR,0)); + EXPECT_NE(SAI_STATUS_SUCCESS, api->set_neighbor_entries_attribute(0,0,0,SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR,0)); + EXPECT_NE(SAI_STATUS_SUCCESS, api->get_neighbor_entries_attribute(0,0,0,0,SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR,0)); + EXPECT_EQ(SAI_STATUS_NOT_IMPLEMENTED, api->remove_all_neighbor_entries(0)); }