unittest/meta/TestMetaDash.cpp (1,040 lines of code) (raw):
#include "Meta.h"
#include "MockMeta.h"
#include "MetaTestSaiInterface.h"
#include <arpa/inet.h>
#include <net/ethernet.h>
#include <gtest/gtest.h>
#include <memory>
using namespace saimeta;
template<typename L>
static bool compare_lists(L la, L lb)
{
// SWSS_LOG_ENTER(); // disabled
if (la.count != lb.count) {
return false;
}
return std::equal(la.list, la.list + la.count, lb.list);
}
static bool operator==(sai_ip_address_t a, sai_ip_address_t b)
{
if (a.addr_family != b.addr_family) {
return false;
}
switch (a.addr_family) {
case SAI_IP_ADDR_FAMILY_IPV4:
return a.addr.ip4 == b.addr.ip4;
case SAI_IP_ADDR_FAMILY_IPV6:
return memcmp(a.addr.ip6, b.addr.ip6, sizeof(a.addr.ip6)) == 0;
default:
return false;
}
}
static bool operator==(sai_ip_prefix_t a, sai_ip_prefix_t b)
{
if (a.addr_family != b.addr_family) {
return false;
}
switch (a.addr_family) {
case SAI_IP_ADDR_FAMILY_IPV4:
return a.addr.ip4 == b.addr.ip4 && a.mask.ip4 == b.mask.ip4;
case SAI_IP_ADDR_FAMILY_IPV6:
return memcmp(a.addr.ip6, b.addr.ip6, sizeof(a.addr.ip6)) == 0 &&
memcmp(a.mask.ip6, b.mask.ip6, sizeof(a.mask.ip6)) == 0;
default:
return false;
}
}
static bool operator==(sai_u16_range_t a, sai_u16_range_t b)
{
return (a.min == b.min) && (a.max == b.max);
}
static sai_object_id_t create_switch(Meta &m)
{
SWSS_LOG_ENTER();
sai_object_id_t oid;
sai_attribute_t attr;
attr.id = SAI_SWITCH_ATTR_INIT_SWITCH;
attr.value.booldata = true;
EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_SWITCH, &oid, SAI_NULL_OBJECT_ID, 1, &attr));
return oid;
}
static sai_object_id_t create_counter(Meta &m, sai_object_id_t switchid)
{
SWSS_LOG_ENTER();
sai_object_id_t oid;
EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_COUNTER, &oid, switchid, 0, nullptr));
return oid;
}
static void remove_counter(Meta &m, sai_object_id_t counter)
{
SWSS_LOG_ENTER();
EXPECT_EQ(SAI_STATUS_SUCCESS, m.remove((sai_object_type_t)SAI_OBJECT_TYPE_COUNTER, counter));
}
static sai_object_id_t create_vnet(Meta &m, sai_object_id_t switchid, uint32_t vni)
{
SWSS_LOG_ENTER();
sai_object_id_t oid;
sai_attribute_t attr;
attr.id = SAI_VNET_ATTR_VNI;
attr.value.u32 = vni;
EXPECT_EQ(SAI_STATUS_SUCCESS, m.create((sai_object_type_t)SAI_OBJECT_TYPE_VNET, &oid, switchid, 1, &attr));
return oid;
}
static void remove_vnet(Meta &m, sai_object_id_t vnet)
{
SWSS_LOG_ENTER();
EXPECT_EQ(SAI_STATUS_SUCCESS, m.remove((sai_object_type_t)SAI_OBJECT_TYPE_VNET, vnet));
}
static sai_object_id_t create_eni(Meta &m, sai_object_id_t switchid, sai_object_id_t vnet)
{
SWSS_LOG_ENTER();
sai_object_id_t oid;
sai_attribute_t attr;
attr.id = SAI_ENI_ATTR_VNET_ID;
attr.value.oid = vnet;
EXPECT_EQ(SAI_STATUS_SUCCESS, m.create((sai_object_type_t)SAI_OBJECT_TYPE_ENI, &oid, switchid, 1, &attr));
return oid;
}
static void remove_eni(Meta &m, sai_object_id_t eni)
{
SWSS_LOG_ENTER();
EXPECT_EQ(SAI_STATUS_SUCCESS, m.remove((sai_object_type_t)SAI_OBJECT_TYPE_ENI, eni));
}
static sai_object_id_t create_outbound_routing_group(Meta &m, sai_object_id_t switchid, bool disabled)
{
SWSS_LOG_ENTER();
sai_object_id_t oid;
sai_attribute_t attr;
attr.id = SAI_OUTBOUND_ROUTING_GROUP_ATTR_DISABLED;
attr.value.booldata = disabled;
EXPECT_EQ(SAI_STATUS_SUCCESS, m.create((sai_object_type_t)SAI_OBJECT_TYPE_OUTBOUND_ROUTING_GROUP, &oid, switchid, 1, &attr));
return oid;
}
static void remove_outbound_routing_group(Meta &m, sai_object_id_t outbound_routing_group)
{
SWSS_LOG_ENTER();
EXPECT_EQ(SAI_STATUS_SUCCESS, m.remove((sai_object_type_t)SAI_OBJECT_TYPE_OUTBOUND_ROUTING_GROUP, outbound_routing_group));
}
TEST(Meta, dash_get_availability)
{
Meta m(std::make_shared<MetaTestSaiInterface>());
sai_object_id_t switchid = create_switch(m);
sai_attribute_t attr;
attr.id = SAI_DASH_ACL_RULE_ATTR_DASH_ACL_GROUP_ID;
attr.value.oid = 0;
uint64_t count = 0;
EXPECT_EQ(SAI_STATUS_INVALID_PARAMETER, m.objectTypeGetAvailability(switchid, (sai_object_type_t)SAI_OBJECT_TYPE_DASH_ACL_RULE, 1, &attr, &count));
attr.id = SAI_DASH_ACL_RULE_ATTR_DASH_ACL_GROUP_ID;
attr.value.oid = 0xFFFFFFF;
EXPECT_EQ(SAI_STATUS_INVALID_PARAMETER, m.objectTypeGetAvailability(switchid, (sai_object_type_t)SAI_OBJECT_TYPE_DASH_ACL_RULE, 1, &attr, &count));
}
TEST(Meta, quad_dash_direction_lookup)
{
Meta m(std::make_shared<MetaTestSaiInterface>());
sai_object_id_t switchid = create_switch(m);
sai_attribute_t attr;
sai_direction_lookup_entry_t entry;
entry.switch_id = switchid;
entry.vni = 1;
std::vector<sai_attribute_t> attrs;
attr.id = SAI_DIRECTION_LOOKUP_ENTRY_ATTR_ACTION;
attr.value.s32 = SAI_DIRECTION_LOOKUP_ENTRY_ACTION_SET_OUTBOUND_DIRECTION;
attrs.push_back(attr);
EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(&entry, (uint32_t)attrs.size(), attrs.data()));
attr.id = SAI_DIRECTION_LOOKUP_ENTRY_ATTR_ACTION;
attr.value.s32 = SAI_DIRECTION_LOOKUP_ENTRY_ACTION_SET_OUTBOUND_DIRECTION;
EXPECT_EQ(SAI_STATUS_SUCCESS, m.set(&entry, &attr));
EXPECT_EQ(SAI_STATUS_SUCCESS, m.get(&entry, (uint32_t)attrs.size(), attrs.data()));
EXPECT_EQ(attrs[0].value.s32, SAI_DIRECTION_LOOKUP_ENTRY_ACTION_SET_OUTBOUND_DIRECTION);
EXPECT_EQ(SAI_STATUS_SUCCESS, m.remove(&entry));
}
TEST(Meta, bulk_dash_direction_lookup)
{
Meta m(std::make_shared<MetaTestSaiInterface>());
sai_object_id_t switchid = create_switch(m);
const uint32_t entries_count = 2;
const uint32_t entry_attrs_count = 1;
sai_attribute_t attrs0[entry_attrs_count] = {
{.id = SAI_DIRECTION_LOOKUP_ENTRY_ATTR_ACTION, .value = (sai_attribute_value_t){.s32 = SAI_DIRECTION_LOOKUP_ENTRY_ACTION_SET_OUTBOUND_DIRECTION}},
};
sai_attribute_t attrs1[entry_attrs_count] = {
{.id = SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION, .value = (sai_attribute_value_t){.s32 = SAI_DIRECTION_LOOKUP_ENTRY_ACTION_SET_OUTBOUND_DIRECTION}},
};
const sai_attribute_t *attr_list[entries_count] = {
attrs0,
attrs1,
};
uint32_t attr_count[entries_count] = {entry_attrs_count, entry_attrs_count};
sai_status_t statuses[entries_count] = {};
sai_direction_lookup_entry_t entries[entries_count] = {
{ .switch_id = switchid, .vni = 10},
{ .switch_id = switchid, .vni = 20},
};
EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkCreate(entries_count, entries, attr_count, attr_list, SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR, statuses));
for (uint32_t i = 0; i < entries_count; i++) {
EXPECT_EQ(SAI_STATUS_SUCCESS, statuses[i]);
}
EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkRemove(entries_count, entries, SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR, statuses));
for (uint32_t i = 0; i < entries_count; i++) {
EXPECT_EQ(SAI_STATUS_SUCCESS, statuses[i]);
}
}
TEST(Meta, quad_dash_eni_ether_address_map_entry)
{
Meta m(std::make_shared<MetaTestSaiInterface>());
sai_object_id_t switchid = create_switch(m);
sai_attribute_t attr;
sai_object_id_t vnet = create_vnet(m, switchid, 100);
sai_object_id_t eni = create_eni(m, switchid, vnet);
sai_eni_ether_address_map_entry_t entry = { .switch_id = switchid, .address = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 }};
std::vector<sai_attribute_t> attrs;
attr.id = SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID;
attr.value.oid = eni;
attrs.push_back(attr);
EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(&entry, (uint32_t)attrs.size(), attrs.data()));
EXPECT_EQ(SAI_STATUS_SUCCESS, m.get(&entry, (uint32_t)attrs.size(), attrs.data()));
EXPECT_EQ(attrs[0].value.oid, eni);
attr.id = SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID;
attr.value.oid = eni;
EXPECT_EQ(SAI_STATUS_SUCCESS, m.set(&entry, &attr));
EXPECT_EQ(SAI_STATUS_SUCCESS, m.get(&entry, (uint32_t)attrs.size(), attrs.data()));
EXPECT_EQ(attrs[0].value.oid, eni);
EXPECT_EQ(SAI_STATUS_SUCCESS, m.remove(&entry));
remove_eni(m, eni);
remove_vnet(m, vnet);
}
TEST(Meta, bulk_dash_eni_ether_address_map_entry)
{
Meta m(std::make_shared<MetaTestSaiInterface>());
sai_object_id_t switchid = create_switch(m);
const uint32_t entries_count = 2;
const uint32_t entry_attrs_count = 1;
sai_object_id_t vnet0 = create_vnet(m, switchid, 100);
sai_object_id_t eni0 = create_eni(m, switchid, vnet0);
sai_object_id_t vnet1 = create_vnet(m, switchid, 200);
sai_object_id_t eni1 = create_eni(m, switchid, vnet1);
sai_attribute_t attrs0[entry_attrs_count] = {
{.id = SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID, .value = (sai_attribute_value_t){.oid = eni0}},
};
sai_attribute_t attrs1[entry_attrs_count] = {
{.id = SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID, .value = (sai_attribute_value_t){.oid = eni1}},
};
const sai_attribute_t *attr_list[entries_count] = {
attrs0,
attrs1,
};
uint32_t attr_count[entries_count] = {entry_attrs_count, entry_attrs_count};
sai_status_t statuses[entries_count] = {};
sai_eni_ether_address_map_entry_t entries[entries_count] = {
{ .switch_id = switchid, .address = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 }},
{ .switch_id = switchid, .address = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x06 }},
};
EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkCreate(entries_count, entries, attr_count, attr_list, SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR, statuses));
for (uint32_t i = 0; i < entries_count; i++) {
EXPECT_EQ(SAI_STATUS_SUCCESS, statuses[i]);
}
EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkRemove(entries_count, entries, SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR, statuses));
for (uint32_t i = 0; i < entries_count; i++) {
EXPECT_EQ(SAI_STATUS_SUCCESS, statuses[i]);
}
remove_eni(m, eni0);
remove_eni(m, eni1);
remove_vnet(m, vnet0);
remove_vnet(m, vnet1);
}
TEST(Meta, quad_dash_eni)
{
Meta m(std::make_shared<MetaTestSaiInterface>());
sai_object_id_t switchid = create_switch(m);
sai_attribute_t attr;
sai_ip_address_t uip4, uip6;
uip4.addr_family = SAI_IP_ADDR_FAMILY_IPV4;
inet_pton(AF_INET, "192.168.0.1", &uip4.addr.ip4);
uip6.addr_family = SAI_IP_ADDR_FAMILY_IPV6;
inet_pton(AF_INET6, "100::ffff:ffff:ffff:ffff", &uip6.addr.ip6);
sai_object_id_t vnet = create_vnet(m, switchid, 101);
std::vector<sai_attribute_t> attrs;
attr.id = SAI_ENI_ATTR_VNET_ID;
attr.value.oid = vnet;
attrs.push_back(attr);
attr.id = SAI_ENI_ATTR_ADMIN_STATE;
attr.value.booldata = true;
attrs.push_back(attr);
attr.id = SAI_ENI_ATTR_VM_VNI;
attr.value.u32 = 123;
attrs.push_back(attr);
attr.id = SAI_ENI_ATTR_CPS;
attr.value.u32 = 10;
attrs.push_back(attr);
attr.id = SAI_ENI_ATTR_PPS;
attr.value.u32 = 20;
attrs.push_back(attr);
attr.id = SAI_ENI_ATTR_FLOWS;
attr.value.u32 = 30;
attrs.push_back(attr);
attr.id = SAI_ENI_ATTR_VM_UNDERLAY_DIP;
attr.value.ipaddr = uip4;
attrs.push_back(attr);
sai_object_id_t eni;
EXPECT_EQ(SAI_STATUS_SUCCESS, m.create((sai_object_type_t)SAI_OBJECT_TYPE_ENI, &eni, switchid, (uint32_t)attrs.size(), attrs.data()));
EXPECT_EQ(SAI_STATUS_SUCCESS, m.get((sai_object_type_t)SAI_OBJECT_TYPE_ENI, eni, (uint32_t)attrs.size(), attrs.data()));
EXPECT_EQ(attrs[0].value.oid, vnet);
EXPECT_TRUE(attrs[1].value.booldata);
EXPECT_EQ(attrs[2].value.u32, 123);
EXPECT_EQ(attrs[3].value.u32, 10);
EXPECT_EQ(attrs[4].value.u32, 20);
EXPECT_EQ(attrs[5].value.u32, 30);
EXPECT_EQ(attrs[6].value.ipaddr.addr.ip4, uip4.addr.ip4);
attr.id = SAI_ENI_ATTR_CPS;
attr.value.u32 = 10;
EXPECT_EQ(SAI_STATUS_SUCCESS, m.set((sai_object_type_t)SAI_OBJECT_TYPE_ENI, eni, &attr));
attr.id = SAI_ENI_ATTR_VM_UNDERLAY_DIP;
attr.value.ipaddr = uip6;
EXPECT_EQ(SAI_STATUS_SUCCESS, m.set((sai_object_type_t)SAI_OBJECT_TYPE_ENI, eni, &attr));
remove_eni(m, eni);
remove_vnet(m, vnet);
}
TEST(Meta, bulk_dash_eni)
{
Meta m(std::make_shared<MetaTestSaiInterface>());
sai_object_id_t switchid = create_switch(m);
const uint32_t enis_count = 2;
const uint32_t eni_attrs_count = 6;
sai_object_id_t vnet0 = create_vnet(m, switchid, 101);
sai_object_id_t vnet1 = create_vnet(m, switchid, 102);
sai_ip_address_t ipaddr0, ipaddr1;
ipaddr0.addr_family = SAI_IP_ADDR_FAMILY_IPV4;
inet_pton(AF_INET, "192.168.0.1", &ipaddr0.addr.ip4);
ipaddr1.addr_family = SAI_IP_ADDR_FAMILY_IPV4;
inet_pton(AF_INET, "192.168.1.1", &ipaddr1.addr.ip4);
sai_attribute_t attrs0[] = {
{.id = SAI_ENI_ATTR_VNET_ID, .value = (sai_attribute_value_t){.oid = vnet0}},
{.id = SAI_ENI_ATTR_ADMIN_STATE, .value = (sai_attribute_value_t){.booldata = true}},
{.id = SAI_ENI_ATTR_VM_VNI, .value = (sai_attribute_value_t){.u32 = 123}},
{.id = SAI_ENI_ATTR_CPS, .value = (sai_attribute_value_t){.u32 = 10}},
{.id = SAI_ENI_ATTR_FLOWS, .value = (sai_attribute_value_t){.u32 = 20}},
{.id = SAI_ENI_ATTR_VM_UNDERLAY_DIP, .value = (sai_attribute_value_t){.ipaddr = ipaddr0}},
};
sai_attribute_t attrs1[] = {
{.id = SAI_ENI_ATTR_VNET_ID, .value = (sai_attribute_value_t){.oid = vnet1}},
{.id = SAI_ENI_ATTR_ADMIN_STATE, .value = (sai_attribute_value_t){.booldata = true}},
{.id = SAI_ENI_ATTR_VM_VNI, .value = (sai_attribute_value_t){.u32 = 124}},
{.id = SAI_ENI_ATTR_CPS, .value = (sai_attribute_value_t){.u32 = 11}},
{.id = SAI_ENI_ATTR_FLOWS, .value = (sai_attribute_value_t){.u32 = 21}},
{.id = SAI_ENI_ATTR_VM_UNDERLAY_DIP, .value = (sai_attribute_value_t){.ipaddr = ipaddr1}},
};
const sai_attribute_t *attr_list[enis_count] = {
attrs0,
attrs1,
};
uint32_t attr_count[enis_count] = {eni_attrs_count, eni_attrs_count};
sai_object_id_t enis[enis_count] = {};
sai_status_t statuses[enis_count] = {};
EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkCreate((sai_object_type_t)SAI_OBJECT_TYPE_ENI, switchid, enis_count, attr_count, attr_list, SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR, enis, statuses));
for (uint32_t i = 0; i < enis_count; i++) {
EXPECT_EQ(SAI_STATUS_SUCCESS, statuses[i]);
}
EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkRemove((sai_object_type_t)SAI_OBJECT_TYPE_ENI, enis_count, enis, SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR, statuses));
for (uint32_t i = 0; i < enis_count; i++) {
EXPECT_EQ(SAI_STATUS_SUCCESS, statuses[i]);
}
remove_vnet(m, vnet0);
remove_vnet(m, vnet1);
}
TEST(Meta, quad_dash_eni_acl)
{
Meta m(std::make_shared<MetaTestSaiInterface>());
sai_object_id_t switchid = create_switch(m);
sai_attribute_t attr;
std::vector<sai_eni_attr_t> acl_attrs = {
SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID,
SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID,
SAI_ENI_ATTR_INBOUND_V4_STAGE3_DASH_ACL_GROUP_ID,
SAI_ENI_ATTR_INBOUND_V4_STAGE4_DASH_ACL_GROUP_ID,
SAI_ENI_ATTR_INBOUND_V4_STAGE5_DASH_ACL_GROUP_ID,
SAI_ENI_ATTR_INBOUND_V6_STAGE1_DASH_ACL_GROUP_ID,
SAI_ENI_ATTR_INBOUND_V6_STAGE2_DASH_ACL_GROUP_ID,
SAI_ENI_ATTR_INBOUND_V6_STAGE3_DASH_ACL_GROUP_ID,
SAI_ENI_ATTR_INBOUND_V6_STAGE4_DASH_ACL_GROUP_ID,
SAI_ENI_ATTR_INBOUND_V6_STAGE5_DASH_ACL_GROUP_ID,
SAI_ENI_ATTR_OUTBOUND_V4_STAGE1_DASH_ACL_GROUP_ID,
SAI_ENI_ATTR_OUTBOUND_V4_STAGE2_DASH_ACL_GROUP_ID,
SAI_ENI_ATTR_OUTBOUND_V4_STAGE3_DASH_ACL_GROUP_ID,
SAI_ENI_ATTR_OUTBOUND_V4_STAGE4_DASH_ACL_GROUP_ID,
SAI_ENI_ATTR_OUTBOUND_V4_STAGE5_DASH_ACL_GROUP_ID,
SAI_ENI_ATTR_OUTBOUND_V6_STAGE1_DASH_ACL_GROUP_ID,
SAI_ENI_ATTR_OUTBOUND_V6_STAGE2_DASH_ACL_GROUP_ID,
SAI_ENI_ATTR_OUTBOUND_V6_STAGE3_DASH_ACL_GROUP_ID,
SAI_ENI_ATTR_OUTBOUND_V6_STAGE4_DASH_ACL_GROUP_ID,
SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID,
};
std::vector<sai_attribute_t> attrs;
std::vector<sai_object_id_t> acl_groups, acl_groups_new;
for (auto at : acl_attrs) {
sai_object_id_t acl_group;
EXPECT_EQ(SAI_STATUS_SUCCESS, m.create((sai_object_type_t)SAI_OBJECT_TYPE_DASH_ACL_GROUP, &acl_group, switchid, 0, nullptr));
acl_groups.push_back(acl_group);
attr.id = at;
attr.value.oid = acl_group;
attrs.push_back(attr);
EXPECT_EQ(SAI_STATUS_SUCCESS, m.create((sai_object_type_t)SAI_OBJECT_TYPE_DASH_ACL_GROUP, &acl_group, switchid, 0, nullptr));
acl_groups_new.push_back(acl_group);
}
sai_object_id_t eni;
EXPECT_EQ(SAI_STATUS_SUCCESS, m.create((sai_object_type_t)SAI_OBJECT_TYPE_ENI, &eni, switchid, (uint32_t)attrs.size(), attrs.data()));
EXPECT_EQ(SAI_STATUS_SUCCESS, m.get((sai_object_type_t)SAI_OBJECT_TYPE_ENI, eni, (uint32_t)attrs.size(), attrs.data()));
for (size_t i = 0; i < attrs.size(); i++) {
attr.id = attrs[i].id;
attr.value.oid = acl_groups_new[i];
EXPECT_EQ(SAI_STATUS_SUCCESS, m.set((sai_object_type_t)SAI_OBJECT_TYPE_ENI, eni, &attr));
}
EXPECT_EQ(SAI_STATUS_SUCCESS, m.get((sai_object_type_t)SAI_OBJECT_TYPE_ENI, eni, (uint32_t)attrs.size(), attrs.data()));
EXPECT_EQ(SAI_STATUS_SUCCESS, m.remove((sai_object_type_t)SAI_OBJECT_TYPE_ENI, eni));
}
TEST(Meta, quad_dash_vip)
{
Meta m(std::make_shared<MetaTestSaiInterface>());
sai_object_id_t switchid = create_switch(m);
sai_attribute_t attr;
std::vector<sai_attribute_t> attrs;
attr.id = SAI_VIP_ENTRY_ATTR_ACTION;
attr.value.s32 = SAI_VIP_ENTRY_ACTION_ACCEPT;
attrs.push_back(attr);
sai_ip_address_t vip_addr;
vip_addr.addr_family = SAI_IP_ADDR_FAMILY_IPV4;
inet_pton(AF_INET, "192.168.0.1", &vip_addr.addr.ip4);
sai_vip_entry_t vip = { .switch_id = switchid, .vip = vip_addr };
EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(&vip, (uint32_t)attrs.size(), attrs.data()));
EXPECT_EQ(SAI_STATUS_SUCCESS, m.get(&vip, (uint32_t)attrs.size(), attrs.data()));
EXPECT_EQ(attrs[0].value.s32, SAI_VIP_ENTRY_ACTION_ACCEPT);
attr.id = SAI_VIP_ENTRY_ATTR_ACTION;
attr.value.s32 = SAI_VIP_ENTRY_ACTION_ACCEPT;
EXPECT_EQ(SAI_STATUS_SUCCESS, m.set(&vip, &attr));
EXPECT_EQ(SAI_STATUS_SUCCESS, m.remove(&vip));
}
TEST(Meta, bulk_dash_vip)
{
Meta m(std::make_shared<MetaTestSaiInterface>());
sai_object_id_t switchid = create_switch(m);
const uint32_t vips_count = 2;
const uint32_t vip_attrs_count = 1;
sai_attribute_t attrs0[] = {
{.id = SAI_VIP_ENTRY_ATTR_ACTION, .value = (sai_attribute_value_t){.s32 = SAI_VIP_ENTRY_ACTION_ACCEPT}},
};
sai_attribute_t attrs1[] = {
{.id = SAI_VIP_ENTRY_ATTR_ACTION, .value = (sai_attribute_value_t){.s32 = SAI_VIP_ENTRY_ACTION_ACCEPT}},
};
const sai_attribute_t *attr_list[vips_count] = {
attrs0,
attrs1,
};
uint32_t attr_count[vips_count] = {vip_attrs_count, vip_attrs_count};
sai_status_t statuses[vips_count] = {};
sai_ip_address_t vip_addr0, vip_addr1;
vip_addr0.addr_family = SAI_IP_ADDR_FAMILY_IPV4;
inet_pton(AF_INET, "192.168.0.1", &vip_addr0.addr.ip4);
vip_addr1.addr_family = SAI_IP_ADDR_FAMILY_IPV6;
inet_pton(AF_INET6, "100::ffff:ffff:ffff:ffff", &vip_addr1.addr.ip6);
sai_vip_entry_t vips[vips_count] = {
{.switch_id = switchid, .vip = vip_addr0},
{.switch_id = switchid, .vip = vip_addr1},
};
EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkCreate(vips_count, vips, attr_count, attr_list, SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR, statuses));
for (uint32_t i = 0; i < vips_count; i++) {
EXPECT_EQ(SAI_STATUS_SUCCESS, statuses[i]);
}
EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkRemove(vips_count, vips, SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR, statuses));
for (uint32_t i = 0; i < vips_count; i++) {
EXPECT_EQ(SAI_STATUS_SUCCESS, statuses[i]);
}
}
TEST(Meta, quad_dash_acl_group)
{
Meta m(std::make_shared<MetaTestSaiInterface>());
sai_object_id_t switchid = create_switch(m);
sai_attribute_t attr;
std::vector<sai_attribute_t> attrs;
attr.id = SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY;
attr.value.s32 = SAI_IP_ADDR_FAMILY_IPV4;
attrs.push_back(attr);
sai_object_id_t acl_group;
EXPECT_EQ(SAI_STATUS_SUCCESS, m.create((sai_object_type_t)SAI_OBJECT_TYPE_DASH_ACL_GROUP, &acl_group, switchid, (uint32_t)attrs.size(), attrs.data()));
EXPECT_EQ(SAI_STATUS_SUCCESS, m.get((sai_object_type_t)SAI_OBJECT_TYPE_DASH_ACL_GROUP, acl_group, (uint32_t)attrs.size(), attrs.data()));
EXPECT_EQ(attrs[0].value.s32, SAI_IP_ADDR_FAMILY_IPV4);
attr.id = SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY;
attr.value.s32 = SAI_IP_ADDR_FAMILY_IPV6;
EXPECT_EQ(SAI_STATUS_SUCCESS, m.set((sai_object_type_t)SAI_OBJECT_TYPE_DASH_ACL_GROUP, acl_group, &attr));
EXPECT_EQ(SAI_STATUS_SUCCESS, m.remove((sai_object_type_t)SAI_OBJECT_TYPE_DASH_ACL_GROUP, acl_group));
}
TEST(Meta, bulk_dash_acl_group)
{
Meta m(std::make_shared<MetaTestSaiInterface>());
sai_object_id_t switchid = create_switch(m);
const uint32_t acls_count = 2;
const uint32_t acl_attrs_count = 1;
sai_attribute_t attrs0[acl_attrs_count] = {
{.id = SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY, .value = (sai_attribute_value_t){.s32 = SAI_IP_ADDR_FAMILY_IPV4}},
};
sai_attribute_t attrs1[acl_attrs_count] = {
{.id = SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY, .value = (sai_attribute_value_t){.s32 = SAI_IP_ADDR_FAMILY_IPV6}},
};
const sai_attribute_t *attr_list[acls_count] = {
attrs0,
attrs1,
};
uint32_t attr_count[acls_count] = {acl_attrs_count, acl_attrs_count};
sai_object_id_t acls[acls_count];
sai_status_t statuses[acls_count] = {};
EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkCreate((sai_object_type_t)SAI_OBJECT_TYPE_DASH_ACL_GROUP, switchid, acls_count, attr_count, attr_list, SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR, acls, statuses));
for (uint32_t i = 0; i < acls_count; i++) {
EXPECT_EQ(SAI_STATUS_SUCCESS, statuses[i]);
}
EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkRemove((sai_object_type_t)SAI_OBJECT_TYPE_DASH_ACL_GROUP, acls_count, acls, SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR, statuses));
for (uint32_t i = 0; i < acls_count; i++) {
EXPECT_EQ(SAI_STATUS_SUCCESS, statuses[i]);
}
}
TEST(Meta, quad_dash_acl_rule)
{
Meta m(std::make_shared<MetaTestSaiInterface>());
sai_object_id_t switchid = create_switch(m);
sai_attribute_t attr;
sai_object_id_t group;
EXPECT_EQ(SAI_STATUS_SUCCESS, m.create((sai_object_type_t)SAI_OBJECT_TYPE_DASH_ACL_GROUP, &group, switchid, 0, nullptr));
sai_object_id_t counter = create_counter(m, switchid);
sai_ip_prefix_t ip_addr_list[2] = {};
ip_addr_list[0].addr_family = SAI_IP_ADDR_FAMILY_IPV4;
inet_pton(AF_INET, "192.168.0.1", &ip_addr_list[0].addr.ip4);
inet_pton(AF_INET, "255.255.0.0", &ip_addr_list[0].mask.ip4);
ip_addr_list[1].addr_family = SAI_IP_ADDR_FAMILY_IPV6;
inet_pton(AF_INET6, "100::ffff:ffff:ffff:ffff", &ip_addr_list[1].addr.ip6);
inet_pton(AF_INET6, "ffff:fff0::", &ip_addr_list[1].mask.ip6);
sai_ip_prefix_list_t ip_prefix_list0 = {.count = 2, .list = ip_addr_list};
sai_ip_prefix_list_t ip_prefix_list1 = {.count = 1, .list = ip_addr_list};
uint8_t protos[2] = {0xAA, 0xBB};
sai_u8_list_t protos_list = {.count=2, .list = protos};
sai_u16_range_t port_ranges[2] = {{.min = 10, .max = 20}, {.min = 30, .max = 40}};
sai_u16_range_list_t port_ranges_list0 = {.count=2, .list = port_ranges};
sai_u16_range_list_t port_ranges_list1 = {.count=1, .list = port_ranges};
std::vector<sai_attribute_t> attrs;
attr.id = SAI_DASH_ACL_RULE_ATTR_ACTION;
attr.value.s32 = SAI_DASH_ACL_RULE_ACTION_PERMIT;
attrs.push_back(attr);
attr.id = SAI_DASH_ACL_RULE_ATTR_DASH_ACL_GROUP_ID;
attr.value.oid = group;
attrs.push_back(attr);
attr.id = SAI_DASH_ACL_RULE_ATTR_DIP;
attr.value.ipprefixlist = ip_prefix_list0;
attrs.push_back(attr);
attr.id = SAI_DASH_ACL_RULE_ATTR_SIP;
attr.value.ipprefixlist = ip_prefix_list1;
attrs.push_back(attr);
attr.id = SAI_DASH_ACL_RULE_ATTR_PROTOCOL;
attr.value.u8list = protos_list;
attrs.push_back(attr);
attr.id = SAI_DASH_ACL_RULE_ATTR_SRC_PORT;
attr.value.u16rangelist = port_ranges_list0;
attrs.push_back(attr);
attr.id = SAI_DASH_ACL_RULE_ATTR_DST_PORT;
attr.value.u16rangelist = port_ranges_list1;
attrs.push_back(attr);
attr.id = SAI_DASH_ACL_RULE_ATTR_COUNTER_ID;
attr.value.oid = counter;
attrs.push_back(attr);
attr.id = SAI_DASH_ACL_RULE_ATTR_PRIORITY;
attr.value.u32 = 1;
attrs.push_back(attr);
sai_object_id_t acl;
EXPECT_EQ(SAI_STATUS_SUCCESS, m.create((sai_object_type_t)SAI_OBJECT_TYPE_DASH_ACL_RULE, &acl, switchid, (uint32_t)attrs.size(), attrs.data()));
EXPECT_EQ(SAI_STATUS_SUCCESS, m.get((sai_object_type_t)SAI_OBJECT_TYPE_DASH_ACL_RULE, acl, (uint32_t)attrs.size(), attrs.data()));
EXPECT_EQ(attrs[0].value.s32, SAI_DASH_ACL_RULE_ACTION_PERMIT);
EXPECT_EQ(attrs[1].value.oid, group);
ASSERT_TRUE(compare_lists(attrs[2].value.ipprefixlist, ip_prefix_list0));
ASSERT_TRUE(compare_lists(attrs[3].value.ipprefixlist, ip_prefix_list1));
ASSERT_TRUE(compare_lists(attrs[4].value.u8list, protos_list));
ASSERT_TRUE(compare_lists(attrs[5].value.u16rangelist, port_ranges_list0));
ASSERT_TRUE(compare_lists(attrs[6].value.u16rangelist, port_ranges_list1));
EXPECT_EQ(attrs[7].value.oid, counter);
EXPECT_EQ(attrs[8].value.u32, 1);
attr.id = SAI_DASH_ACL_RULE_ATTR_ACTION;
attr.value.s32 = SAI_DASH_ACL_RULE_ACTION_DENY_AND_CONTINUE;
EXPECT_EQ(SAI_STATUS_SUCCESS, m.set((sai_object_type_t)SAI_OBJECT_TYPE_DASH_ACL_RULE, acl, &attr));
attr.id = SAI_DASH_ACL_RULE_ATTR_DASH_ACL_GROUP_ID;
attr.value.oid = acl;
uint64_t count = 0;
EXPECT_EQ(SAI_STATUS_SUCCESS, m.objectTypeGetAvailability(switchid, (sai_object_type_t)SAI_OBJECT_TYPE_DASH_ACL_RULE, 1, &attr, &count));
EXPECT_EQ(SAI_STATUS_SUCCESS, m.remove((sai_object_type_t)SAI_OBJECT_TYPE_DASH_ACL_RULE, acl));
remove_counter(m, counter);
EXPECT_EQ(SAI_STATUS_SUCCESS, m.remove((sai_object_type_t)SAI_OBJECT_TYPE_DASH_ACL_GROUP, group));
}
TEST(Meta, bulk_dash_acl_rule)
{
Meta m(std::make_shared<MetaTestSaiInterface>());
sai_object_id_t switchid = create_switch(m);
const uint32_t acls_count = 2;
const uint32_t acl_attrs_count = 9;
sai_object_id_t counter0 = create_counter(m, switchid);
sai_object_id_t counter1 = create_counter(m, switchid);
sai_object_id_t group0;
EXPECT_EQ(SAI_STATUS_SUCCESS, m.create((sai_object_type_t)SAI_OBJECT_TYPE_DASH_ACL_GROUP, &group0, switchid, 0, nullptr));
sai_object_id_t group1;
EXPECT_EQ(SAI_STATUS_SUCCESS, m.create((sai_object_type_t)SAI_OBJECT_TYPE_DASH_ACL_GROUP, &group1, switchid, 0, nullptr));
sai_ip_prefix_t ip_prefix_arr0[2] = {};
ip_prefix_arr0[0].addr_family = SAI_IP_ADDR_FAMILY_IPV4;
inet_pton(AF_INET, "192.168.0.1", &ip_prefix_arr0[0].addr.ip4);
inet_pton(AF_INET, "255.255.255.0", &ip_prefix_arr0[0].mask.ip4);
ip_prefix_arr0[1].addr_family = SAI_IP_ADDR_FAMILY_IPV6;
inet_pton(AF_INET6, "100::ffff:ffff:ffff:ffff", &ip_prefix_arr0[1].addr.ip6);
inet_pton(AF_INET6, "ffff::", &ip_prefix_arr0[1].mask.ip6);
sai_ip_prefix_t ip_prefix_arr1[2] = {};
ip_prefix_arr1[0].addr_family = SAI_IP_ADDR_FAMILY_IPV4;
inet_pton(AF_INET, "192.168.0.2", &ip_prefix_arr1[0].addr.ip4);
inet_pton(AF_INET, "255.255.0.0", &ip_prefix_arr1[0].mask.ip4);
ip_prefix_arr1[1].addr_family = SAI_IP_ADDR_FAMILY_IPV6;
inet_pton(AF_INET6, "100::ffff:ffff:ffff:fffe", &ip_prefix_arr1[1].addr.ip6);
inet_pton(AF_INET6, "ffff::", &ip_prefix_arr1[1].mask.ip6);
sai_ip_prefix_list_t ip_prefix_list0 = {.count = 1, .list = ip_prefix_arr0};
sai_ip_prefix_list_t ip_prefix_list1 = {.count = 1, .list = ip_prefix_arr1};
uint8_t protos0[2] = {0xAA, 0xBB};
uint8_t protos1[2] = {0xCC, 0xDD};
sai_u8_list_t protos_list0 = {.count=2, .list = protos0};
sai_u8_list_t protos_list1 = {.count=2, .list = protos1};
sai_u16_range_t port_ranges0[2] = {{.min = 10, .max = 20}, {.min = 30, .max = 40}};
sai_u16_range_t port_ranges1[2] = {{.min = 50, .max = 60}, {.min = 70, .max = 80}};
sai_u16_range_list_t u16_range_list0 = {.count=2, .list = port_ranges0};
sai_u16_range_list_t u16_range_list1 = {.count=2, .list = port_ranges1};
sai_attribute_t attrs0[acl_attrs_count] = {
{.id = SAI_DASH_ACL_RULE_ATTR_ACTION, .value = (sai_attribute_value_t){.s32 = SAI_DASH_ACL_RULE_ACTION_PERMIT_AND_CONTINUE}},
{.id = SAI_DASH_ACL_RULE_ATTR_DASH_ACL_GROUP_ID, .value = (sai_attribute_value_t){.oid = group0}},
{.id = SAI_DASH_ACL_RULE_ATTR_DIP, .value = (sai_attribute_value_t){.ipprefixlist = ip_prefix_list0}},
{.id = SAI_DASH_ACL_RULE_ATTR_SIP, .value = (sai_attribute_value_t){.ipprefixlist = ip_prefix_list1}},
{.id = SAI_DASH_ACL_RULE_ATTR_PROTOCOL, .value = (sai_attribute_value_t){.u8list = protos_list0}},
{.id = SAI_DASH_ACL_RULE_ATTR_SRC_PORT, .value = (sai_attribute_value_t){.u16rangelist = u16_range_list0}},
{.id = SAI_DASH_ACL_RULE_ATTR_DST_PORT, .value = (sai_attribute_value_t){.u16rangelist = u16_range_list1}},
{.id = SAI_DASH_ACL_RULE_ATTR_COUNTER_ID, .value = (sai_attribute_value_t){.oid = counter0}},
{.id = SAI_DASH_ACL_RULE_ATTR_PRIORITY, .value = (sai_attribute_value_t){.u32 = 1}},
};
sai_attribute_t attrs1[acl_attrs_count] = {
{.id = SAI_DASH_ACL_RULE_ATTR_ACTION, .value = (sai_attribute_value_t){.s32 = SAI_DASH_ACL_RULE_ACTION_DENY}},
{.id = SAI_DASH_ACL_RULE_ATTR_DASH_ACL_GROUP_ID, .value = (sai_attribute_value_t){.oid = group1}},
{.id = SAI_DASH_ACL_RULE_ATTR_DIP, .value = (sai_attribute_value_t){.ipprefixlist = ip_prefix_list0}},
{.id = SAI_DASH_ACL_RULE_ATTR_SIP, .value = (sai_attribute_value_t){.ipprefixlist = ip_prefix_list1}},
{.id = SAI_DASH_ACL_RULE_ATTR_PROTOCOL, .value = (sai_attribute_value_t){.u8list = protos_list1}},
{.id = SAI_DASH_ACL_RULE_ATTR_SRC_PORT, .value = (sai_attribute_value_t){.u16rangelist = u16_range_list1}},
{.id = SAI_DASH_ACL_RULE_ATTR_DST_PORT, .value = (sai_attribute_value_t){.u16rangelist = u16_range_list0}},
{.id = SAI_DASH_ACL_RULE_ATTR_COUNTER_ID, .value = (sai_attribute_value_t){.oid = counter1}},
{.id = SAI_DASH_ACL_RULE_ATTR_PRIORITY, .value = (sai_attribute_value_t){.u32 = 2}},
};
const sai_attribute_t *attr_list[acls_count] = {
attrs0,
attrs1,
};
uint32_t attr_count[acls_count] = {acl_attrs_count, acl_attrs_count};
sai_object_id_t acls[acls_count];
sai_status_t statuses[acls_count] = {};
EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkCreate((sai_object_type_t)SAI_OBJECT_TYPE_DASH_ACL_RULE, switchid, acls_count, attr_count, attr_list, SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR, acls, statuses));
for (uint32_t i = 0; i < acls_count; i++) {
EXPECT_EQ(SAI_STATUS_SUCCESS, statuses[i]);
}
EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkRemove((sai_object_type_t)SAI_OBJECT_TYPE_DASH_ACL_RULE, acls_count, acls, SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR, statuses));
for (uint32_t i = 0; i < acls_count; i++) {
EXPECT_EQ(SAI_STATUS_SUCCESS, statuses[i]);
}
EXPECT_EQ(SAI_STATUS_SUCCESS, m.remove((sai_object_type_t)SAI_OBJECT_TYPE_DASH_ACL_GROUP, group0));
EXPECT_EQ(SAI_STATUS_SUCCESS, m.remove((sai_object_type_t)SAI_OBJECT_TYPE_DASH_ACL_GROUP, group1));
remove_counter(m, counter0);
remove_counter(m, counter1);
}
TEST(Meta, quad_dash_vnet)
{
Meta m(std::make_shared<MetaTestSaiInterface>());
sai_object_id_t switchid = create_switch(m);
sai_attribute_t attr;
sai_object_id_t vnet;
attr.id = SAI_VNET_ATTR_VNI;
attr.value.u32 = 10;
EXPECT_EQ(SAI_STATUS_SUCCESS, m.create((sai_object_type_t)SAI_OBJECT_TYPE_VNET, &vnet, switchid, 1, &attr));
EXPECT_EQ(SAI_STATUS_SUCCESS, m.get((sai_object_type_t)SAI_OBJECT_TYPE_VNET, vnet, 1, &attr));
EXPECT_EQ(attr.value.u32, 10);
attr.id = SAI_VNET_ATTR_VNI;
attr.value.u32 = 20;
EXPECT_EQ(SAI_STATUS_SUCCESS, m.set((sai_object_type_t)SAI_OBJECT_TYPE_VNET, vnet, &attr));
EXPECT_EQ(SAI_STATUS_SUCCESS, m.remove((sai_object_type_t)SAI_OBJECT_TYPE_VNET, vnet));
}
TEST(Meta, bulk_dash_vnet)
{
Meta m(std::make_shared<MetaTestSaiInterface>());
sai_object_id_t switchid = create_switch(m);
const uint32_t vnets_count = 2;
const uint32_t vnet_attrs_count = 1;
sai_attribute_t attrs0[] = {
{.id = SAI_VNET_ATTR_VNI, .value = (sai_attribute_value_t){.u32 = 10}},
};
sai_attribute_t attrs1[] = {
{.id = SAI_VNET_ATTR_VNI, .value = (sai_attribute_value_t){.u32 = 20}},
};
const sai_attribute_t *attr_list[vnets_count] = {
attrs0,
attrs1,
};
uint32_t attr_count[vnets_count] = {vnet_attrs_count, vnet_attrs_count};
sai_object_id_t vnets[vnets_count];
sai_status_t statuses[vnets_count] = {};
EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkCreate((sai_object_type_t)SAI_OBJECT_TYPE_VNET, switchid, vnets_count, attr_count, attr_list, SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR, vnets, statuses));
for (uint32_t i = 0; i < vnets_count; i++) {
EXPECT_EQ(SAI_STATUS_SUCCESS, statuses[i]);
}
EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkRemove((sai_object_type_t)SAI_OBJECT_TYPE_VNET, vnets_count, vnets, SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR, statuses));
for (uint32_t i = 0; i < vnets_count; i++) {
EXPECT_EQ(SAI_STATUS_SUCCESS, statuses[i]);
}
}
TEST(Meta, quad_dash_inbound_routing_entry)
{
Meta m(std::make_shared<MetaTestSaiInterface>());
sai_object_id_t switchid = create_switch(m);
sai_attribute_t attr;
sai_object_id_t vnet = create_vnet(m, switchid, 10);
sai_object_id_t eni = create_eni(m, switchid, vnet);
sai_ip_address_t sip, sip_mask;
sip.addr_family = SAI_IP_ADDR_FAMILY_IPV4;
inet_pton(AF_INET, "192.168.0.1", &sip.addr.ip4);
sip_mask.addr_family = SAI_IP_ADDR_FAMILY_IPV4;
inet_pton(AF_INET, "255.255.255.0", &sip_mask.addr.ip4);
sai_inbound_routing_entry_t entry = { .switch_id = switchid, .eni_id = eni, .vni = 10, .sip = sip, .sip_mask = sip_mask, .priority = 1};
std::vector<sai_attribute_t> attrs;
attr.id = SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION;
attr.value.s32 = SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP_PA_VALIDATE;
attrs.push_back(attr);
attr.id = SAI_INBOUND_ROUTING_ENTRY_ATTR_SRC_VNET_ID;
attr.value.oid = vnet;
attrs.push_back(attr);
EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(&entry, (uint32_t)attrs.size(), attrs.data()));
EXPECT_EQ(SAI_STATUS_SUCCESS, m.get(&entry, (uint32_t)attrs.size(), attrs.data()));
attr.id = SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION;
attr.value.s32 = SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP;
EXPECT_EQ(SAI_STATUS_SUCCESS, m.set(&entry, &attr));
EXPECT_EQ(SAI_STATUS_SUCCESS, m.remove(&entry));
remove_eni(m, eni);
remove_vnet(m, vnet);
}
TEST(Meta, bulk_dash_inbound_routing_entry)
{
Meta m(std::make_shared<MetaTestSaiInterface>());
sai_object_id_t switchid = create_switch(m);
const uint32_t entries_count = 2;
const uint32_t entry_attrs_count = 2;
sai_object_id_t vnet0 = create_vnet(m, switchid, 101);
sai_object_id_t eni0 = create_eni(m, switchid, vnet0);
sai_object_id_t vnet1 = create_vnet(m, switchid, 102);
sai_object_id_t eni1 = create_eni(m, switchid, vnet0);
sai_ip_address_t sip0, sip_mask0;
sai_ip_address_t sip1, sip_mask1;
sip0.addr_family = SAI_IP_ADDR_FAMILY_IPV4;
inet_pton(AF_INET, "192.168.0.1", &sip0.addr.ip4);
sip_mask0.addr_family = SAI_IP_ADDR_FAMILY_IPV4;
inet_pton(AF_INET, "255.255.255.0", &sip_mask0.addr.ip4);
sip1.addr_family = SAI_IP_ADDR_FAMILY_IPV4;
inet_pton(AF_INET, "192.168.0.2", &sip1.addr.ip4);
sip_mask1.addr_family = SAI_IP_ADDR_FAMILY_IPV4;
inet_pton(AF_INET, "255.255.0.0", &sip_mask1.addr.ip4);
sai_attribute_t attrs0[entry_attrs_count] = {
{.id = SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION, .value = (sai_attribute_value_t){.s32 = SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP}},
{.id = SAI_INBOUND_ROUTING_ENTRY_ATTR_SRC_VNET_ID, .value = (sai_attribute_value_t){.oid = vnet0}},
};
sai_attribute_t attrs1[entry_attrs_count] = {
{.id = SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION, .value = (sai_attribute_value_t){.s32 = SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP}},
{.id = SAI_INBOUND_ROUTING_ENTRY_ATTR_SRC_VNET_ID, .value = (sai_attribute_value_t){.oid = vnet1}},
};
const sai_attribute_t *attr_list[entries_count] = {
attrs0,
attrs1,
};
uint32_t attr_count[entries_count] = {entry_attrs_count, entry_attrs_count};
sai_status_t statuses[entries_count] = {};
sai_inbound_routing_entry_t entries[entries_count] = {
{ .switch_id = switchid, .eni_id = eni0, .vni = 10, .sip = sip0, .sip_mask = sip_mask0, .priority = 1},
{ .switch_id = switchid, .eni_id = eni1, .vni = 100, .sip = sip1, .sip_mask = sip_mask1, .priority = 2}
};
EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkCreate(entries_count, entries, attr_count, attr_list, SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR, statuses));
for (uint32_t i = 0; i < entries_count; i++) {
EXPECT_EQ(SAI_STATUS_SUCCESS, statuses[i]);
}
EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkRemove(entries_count, entries, SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR, statuses));
for (uint32_t i = 0; i < entries_count; i++) {
EXPECT_EQ(SAI_STATUS_SUCCESS, statuses[i]);
}
remove_eni(m, eni0);
remove_eni(m, eni1);
remove_vnet(m, vnet0);
remove_vnet(m, vnet1);
}
TEST(Meta, quad_dash_pa_validation)
{
Meta m(std::make_shared<MetaTestSaiInterface>());
sai_object_id_t switchid = create_switch(m);
sai_attribute_t attr;
sai_object_id_t vnet = create_vnet(m, switchid, 10);
sai_pa_validation_entry_t entry;
entry.switch_id = switchid;
entry.vnet_id = vnet;
entry.sip.addr_family = SAI_IP_ADDR_FAMILY_IPV4;
inet_pton(AF_INET, "192.3.3.3", &entry.sip.addr.ip4);
std::vector<sai_attribute_t> attrs;
attr.id = SAI_PA_VALIDATION_ENTRY_ATTR_ACTION;
attr.value.s32 = SAI_PA_VALIDATION_ENTRY_ACTION_PERMIT;
attrs.push_back(attr);
EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(&entry, (uint32_t)attrs.size(), attrs.data()));
EXPECT_EQ(SAI_STATUS_SUCCESS, m.get(&entry, (uint32_t)attrs.size(), attrs.data()));
EXPECT_EQ(attrs[0].value.s32, SAI_PA_VALIDATION_ENTRY_ACTION_PERMIT);
attr.id = SAI_PA_VALIDATION_ENTRY_ATTR_ACTION;
attr.value.s32 = SAI_PA_VALIDATION_ENTRY_ACTION_PERMIT;
EXPECT_EQ(SAI_STATUS_SUCCESS, m.set(&entry, &attr));
EXPECT_EQ(SAI_STATUS_SUCCESS, m.remove(&entry));
remove_vnet(m, vnet);
}
TEST(Meta, bulk_dash_pa_validation)
{
Meta m(std::make_shared<MetaTestSaiInterface>());
sai_object_id_t switchid = create_switch(m);
const uint32_t entries_count = 2;
const uint32_t entry_attrs_count = 1;
sai_object_id_t vnet0 = create_vnet(m, switchid, 10);
sai_object_id_t vnet1 = create_vnet(m, switchid, 20);
sai_ip_address_t sip0 = {};
sai_ip_address_t sip1 = {};
sip0.addr_family = SAI_IP_ADDR_FAMILY_IPV4;
sip1.addr_family = SAI_IP_ADDR_FAMILY_IPV6;
inet_pton(AF_INET, "192.1.1.1", &sip0.addr.ip4);
inet_pton(AF_INET6, "ffff::", &sip1.addr.ip6);
sai_attribute_t attrs0[entry_attrs_count] = {
{.id = SAI_PA_VALIDATION_ENTRY_ATTR_ACTION, .value = (sai_attribute_value_t){.s32 = SAI_PA_VALIDATION_ENTRY_ACTION_PERMIT}},
};
sai_attribute_t attrs1[entry_attrs_count] = {
{.id = SAI_PA_VALIDATION_ENTRY_ATTR_ACTION, .value = (sai_attribute_value_t){.s32 = SAI_PA_VALIDATION_ENTRY_ACTION_PERMIT}},
};
const sai_attribute_t *attr_list[entries_count] = {
attrs0,
attrs1,
};
uint32_t attr_count[entries_count] = {entry_attrs_count, entry_attrs_count};
sai_status_t statuses[entries_count] = {};
sai_pa_validation_entry_t entries[entries_count] = {
{ .switch_id = switchid, .vnet_id = vnet0, .sip = sip0},
{ .switch_id = switchid, .vnet_id = vnet1, .sip = sip1},
};
EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkCreate(entries_count, entries, attr_count, attr_list, SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR, statuses));
for (uint32_t i = 0; i < entries_count; i++) {
EXPECT_EQ(SAI_STATUS_SUCCESS, statuses[i]);
}
EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkRemove(entries_count, entries, SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR, statuses));
for (uint32_t i = 0; i < entries_count; i++) {
EXPECT_EQ(SAI_STATUS_SUCCESS, statuses[i]);
}
remove_vnet(m, vnet0);
remove_vnet(m, vnet1);
}
TEST(Meta, quad_dash_outbound_routing_entry)
{
Meta m(std::make_shared<MetaTestSaiInterface>());
sai_object_id_t switchid = create_switch(m);
sai_attribute_t attr;
sai_object_id_t counter = create_counter(m, switchid);
sai_object_id_t vnet = create_vnet(m, switchid, 101);
sai_object_id_t outbound_routing_group = create_outbound_routing_group(m, switchid, false);
sai_ip_address_t oip6;
oip6.addr_family = SAI_IP_ADDR_FAMILY_IPV6;
inet_pton(AF_INET6, "ffff::", &oip6.addr);
sai_outbound_routing_entry_t entry0;
entry0.switch_id = switchid;
entry0.outbound_routing_group_id = outbound_routing_group;
entry0.destination.addr_family = SAI_IP_ADDR_FAMILY_IPV4;
inet_pton(AF_INET, "192.168.1.0", &entry0.destination.addr.ip4);
inet_pton(AF_INET, "255.255.255.0", &entry0.destination.mask.ip4);
std::vector<sai_attribute_t> attrs;
attr.id = SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION;
attr.value.u32 = SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET;
attrs.push_back(attr);
attr.id = SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID;
attr.value.oid = vnet;
attrs.push_back(attr);
attr.id = SAI_OUTBOUND_ROUTING_ENTRY_ATTR_OVERLAY_IP;
attr.value.ipaddr = oip6;
attrs.push_back(attr);
attr.id = SAI_OUTBOUND_ROUTING_ENTRY_ATTR_COUNTER_ID;
attr.value.oid = counter;
attrs.push_back(attr);
EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(&entry0, (uint32_t)attrs.size(), attrs.data()));
EXPECT_EQ(SAI_STATUS_SUCCESS, m.get(&entry0, (uint32_t)attrs.size(), attrs.data()));
EXPECT_EQ(attrs[0].value.u32, SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET);
EXPECT_EQ(attrs[1].value.oid, vnet);
EXPECT_EQ(attrs[2].value.ipaddr, oip6);
EXPECT_EQ(attrs[3].value.oid, counter);
attr.id = SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION;
attr.value.u32 = SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_DIRECT;
EXPECT_EQ(SAI_STATUS_SUCCESS, m.set(&entry0, &attr));
EXPECT_EQ(SAI_STATUS_SUCCESS, m.remove(&entry0));
remove_outbound_routing_group(m, outbound_routing_group);
remove_vnet(m, vnet);
remove_counter(m, counter);
}
TEST(Meta, bulk_dash_outbound_routing_entry)
{
Meta m(std::make_shared<MetaTestSaiInterface>());
sai_object_id_t switchid = create_switch(m);
const uint32_t entries_count = 2;
const uint32_t entry_attrs_count = 4;
sai_object_id_t counter0 = create_counter(m, switchid);
sai_object_id_t counter1 = create_counter(m, switchid);
sai_ip_address_t oip4, oip6;
oip4.addr_family = SAI_IP_ADDR_FAMILY_IPV4;
inet_pton(AF_INET, "1.2.3.4", &oip4.addr);
oip6.addr_family = SAI_IP_ADDR_FAMILY_IPV6;
inet_pton(AF_INET6, "ffff::", &oip6.addr);
sai_object_id_t vnet0 = create_vnet(m, switchid, 101);
sai_object_id_t vnet1 = create_vnet(m, switchid, 102);
sai_object_id_t outbound_routing_group0 = create_outbound_routing_group(m, switchid, false);
sai_object_id_t outbound_routing_group1 = create_outbound_routing_group(m, switchid, false);
sai_ip_prefix_t dst0 = {};
sai_ip_prefix_t dst1 = {};
dst0.addr_family = SAI_IP_ADDR_FAMILY_IPV4;
dst1.addr_family = SAI_IP_ADDR_FAMILY_IPV6;
inet_pton(AF_INET, "192.1.1.1", &dst0.addr.ip4);
inet_pton(AF_INET, "255.255.255.0", &dst0.mask.ip4);
inet_pton(AF_INET6, "fe80::886a:feff:fe31:bfe0", &dst1.addr.ip6);
inet_pton(AF_INET6, "ffff:ffff::", &dst1.mask.ip6);
sai_attribute_t attrs0[entry_attrs_count] = {
{.id = SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION, .value = (sai_attribute_value_t){.s32 = SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET}},
{.id = SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID, .value = (sai_attribute_value_t){.oid = vnet0}},
{.id = SAI_OUTBOUND_ROUTING_ENTRY_ATTR_OVERLAY_IP, .value = (sai_attribute_value_t){.ipaddr = oip4}},
{.id = SAI_OUTBOUND_ROUTING_ENTRY_ATTR_COUNTER_ID, .value = (sai_attribute_value_t){.oid = counter0}},
};
sai_attribute_t attrs1[entry_attrs_count] = {
{.id = SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION, .value = (sai_attribute_value_t){.s32 = SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET}},
{.id = SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID, .value = (sai_attribute_value_t){.oid = vnet1}},
{.id = SAI_OUTBOUND_ROUTING_ENTRY_ATTR_OVERLAY_IP, .value = (sai_attribute_value_t){.ipaddr = oip6}},
{.id = SAI_OUTBOUND_ROUTING_ENTRY_ATTR_COUNTER_ID, .value = (sai_attribute_value_t){.oid = counter1}},
};
const sai_attribute_t *attr_list[entries_count] = {
attrs0,
attrs1,
};
uint32_t attr_count[entries_count] = {entry_attrs_count, entry_attrs_count};
sai_status_t statuses[entries_count] = {};
sai_outbound_routing_entry_t entries[entries_count] = {
{ .switch_id = switchid, .destination = dst0, .outbound_routing_group_id = outbound_routing_group0},
{ .switch_id = switchid, .destination = dst1, .outbound_routing_group_id = outbound_routing_group1},
};
EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkCreate(entries_count, entries, attr_count, attr_list, SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR, statuses));
for (uint32_t i = 0; i < entries_count; i++) {
EXPECT_EQ(SAI_STATUS_SUCCESS, statuses[i]);
}
EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkRemove(entries_count, entries, SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR, statuses));
for (uint32_t i = 0; i < entries_count; i++) {
EXPECT_EQ(SAI_STATUS_SUCCESS, statuses[i]);
}
remove_outbound_routing_group(m, outbound_routing_group0);
remove_outbound_routing_group(m, outbound_routing_group1);
remove_vnet(m, vnet0);
remove_vnet(m, vnet1);
remove_counter(m, counter0);
remove_counter(m, counter1);
}
TEST(Meta, quad_dash_outbound_ca_to_pa_entry)
{
Meta m(std::make_shared<MetaTestSaiInterface>());
sai_object_id_t switchid = create_switch(m);
sai_object_id_t counter = create_counter(m, switchid);
sai_ip_address_t uip4;
uip4.addr_family = SAI_IP_ADDR_FAMILY_IPV4;
inet_pton(AF_INET, "192.168.0.1", &uip4.addr.ip4);
sai_object_id_t vnet = create_vnet(m, switchid, 10);
sai_outbound_ca_to_pa_entry_t entry;
entry.switch_id = switchid;
entry.dst_vnet_id = vnet;
entry.dip.addr_family = SAI_IP_ADDR_FAMILY_IPV4;
inet_pton(AF_INET, "192.168.0.1", &entry.dip.addr.ip4);
sai_attribute_t attr;
std::vector<sai_attribute_t> attrs;
attr.id = SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP;
attr.value.ipaddr = uip4;
attrs.push_back(attr);
attr.id = SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC;
sai_mac_t dmac = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 };
memcpy(attr.value.mac, dmac, 6);
attrs.push_back(attr);
attr.id = SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI;
attr.value.booldata = true;
attrs.push_back(attr);
attr.id = SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_COUNTER_ID;
attr.value.oid = counter;
attrs.push_back(attr);
EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(&entry, (uint32_t)attrs.size(), attrs.data()));
EXPECT_EQ(SAI_STATUS_SUCCESS, m.get(&entry, (uint32_t)attrs.size(), attrs.data()));
EXPECT_EQ(attrs[0].value.ipaddr, uip4);
EXPECT_EQ(memcmp(attrs[1].value.mac, dmac, sizeof(dmac)), 0);
EXPECT_EQ(attrs[2].value.booldata, true);
EXPECT_EQ(attrs[3].value.oid, counter);
attr.id = SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI;
attr.value.booldata = true;
EXPECT_EQ(SAI_STATUS_SUCCESS, m.set(&entry, &attr));
EXPECT_EQ(SAI_STATUS_SUCCESS, m.remove(&entry));
remove_vnet(m, vnet);
remove_counter(m, counter);
}
TEST(Meta, bulk_dash_outbound_ca_to_pa_entry)
{
Meta m(std::make_shared<MetaTestSaiInterface>());
sai_object_id_t switchid = create_switch(m);
const uint32_t entries_count = 2;
const uint32_t entry_attrs_count = 4;
sai_object_id_t counter0 = create_counter(m, switchid);
sai_object_id_t counter1 = create_counter(m, switchid);
sai_object_id_t vnet0 = create_vnet(m, switchid, 10);
sai_object_id_t vnet1 = create_vnet(m, switchid, 20);
sai_ip_address_t dip0 = {};
sai_ip_address_t dip1 = {};
sai_ip_address_t udip0 = {};
sai_ip_address_t udip1 = {};
dip0.addr_family = SAI_IP_ADDR_FAMILY_IPV4;
dip1.addr_family = SAI_IP_ADDR_FAMILY_IPV6;
udip0.addr_family = SAI_IP_ADDR_FAMILY_IPV6;
udip1.addr_family = SAI_IP_ADDR_FAMILY_IPV4;
inet_pton(AF_INET, "192.1.1.1", &dip0.addr.ip4);
inet_pton(AF_INET6, "fe80::886a:feff:fe31:bfe0", &dip1.addr.ip6);
inet_pton(AF_INET6, "fe80::886a:feff:fe31:bfe1", &udip0.addr.ip6);
inet_pton(AF_INET, "192.1.1.2", &udip1.addr.ip4);
sai_attribute_t attrs0[entry_attrs_count] = {
{.id = SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP, .value = (sai_attribute_value_t){.ipaddr = udip0}},
{.id = SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC, .value = (sai_attribute_value_t){.mac = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55}}},
{.id = SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI, .value = (sai_attribute_value_t){.booldata = true}},
{.id = SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_COUNTER_ID, .value = (sai_attribute_value_t){.oid = counter0}}
};
sai_attribute_t attrs1[entry_attrs_count] = {
{.id = SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP, .value = (sai_attribute_value_t){.ipaddr = udip1}},
{.id = SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC, .value = (sai_attribute_value_t){.mac = {0x00, 0x11, 0x22, 0x33, 0x44, 0x56}}},
{.id = SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI, .value = (sai_attribute_value_t){.booldata = false}},
{.id = SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_COUNTER_ID, .value = (sai_attribute_value_t){.oid = counter1}}
};
const sai_attribute_t *attr_list[entries_count] = {
attrs0,
attrs1,
};
uint32_t attr_count[entries_count] = {entry_attrs_count, entry_attrs_count};
sai_status_t statuses[entries_count] = {};
sai_outbound_ca_to_pa_entry_t entries[entries_count] = {
{ .switch_id = switchid, .dst_vnet_id = vnet0, .dip = dip0},
{ .switch_id = switchid, .dst_vnet_id = vnet1, .dip = dip1},
};
EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkCreate(entries_count, entries, attr_count, attr_list, SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR, statuses));
for (uint32_t i = 0; i < entries_count; i++) {
EXPECT_EQ(SAI_STATUS_SUCCESS, statuses[i]);
}
EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkRemove(entries_count, entries, SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR, statuses));
for (uint32_t i = 0; i < entries_count; i++) {
EXPECT_EQ(SAI_STATUS_SUCCESS, statuses[i]);
}
remove_vnet(m, vnet0);
remove_vnet(m, vnet1);
remove_counter(m, counter0);
remove_counter(m, counter1);
}