void test_fdb_flush()

in vslib/tests.cpp [409:704]


void test_fdb_flush()
{
    SWSS_LOG_ENTER();

    sai_reinit();

    // TODO we need 10 cases, 10th where nothing was removed

    sai_attribute_t attr;

    sai_object_id_t switch_id;

    attr.id = SAI_SWITCH_ATTR_INIT_SWITCH;
    attr.value.booldata = true;

    SUCCESS(sai_metadata_sai_switch_api->create_switch(&switch_id, 1, &attr));

    // set notification callback

    attr.id = SAI_SWITCH_ATTR_FDB_EVENT_NOTIFY;
    attr.value.ptr = (void*)&sai_fdb_event_notification;

    SUCCESS(sai_metadata_sai_switch_api->set_switch_attribute(switch_id, &attr));

    attr.id = SAI_SWITCH_ATTR_DEFAULT_1Q_BRIDGE_ID;

    SUCCESS(sai_metadata_sai_switch_api->get_switch_attribute(switch_id, 1, &attr));

    sai_object_id_t bridge_id = attr.value.oid;

    sai_object_id_t list[100];

    attr.id = SAI_BRIDGE_ATTR_PORT_LIST;
    attr.value.objlist.count = 100;
    attr.value.objlist.list = list;

    SUCCESS(sai_metadata_sai_bridge_api->get_bridge_attribute(bridge_id, 1, &attr));

    sai_object_id_t bp1 = list[1];
    sai_object_id_t bp2 = list[2];

    SWSS_LOG_NOTICE("bridge ports: %s, %s",
            sai_serialize_object_id(bp1).c_str(),
            sai_serialize_object_id(bp2).c_str());

    // create 2nd vlan

    attr.id = SAI_VLAN_ATTR_VLAN_ID;
    attr.value.u16 = 2;

    sai_object_id_t vlan2_id;

    SUCCESS(sai_metadata_sai_vlan_api->create_vlan(&vlan2_id, switch_id, 1, &attr));

    SWSS_LOG_NOTICE("vlan 2 id: %s", sai_serialize_object_id(vlan2_id).c_str());

    // create 3rd vlan

    attr.id = SAI_VLAN_ATTR_VLAN_ID;
    attr.value.u16 = 3;

    sai_object_id_t vlan3_id;

    SUCCESS(sai_metadata_sai_vlan_api->create_vlan(&vlan3_id, switch_id, 1, &attr));

    SWSS_LOG_NOTICE("vlan 3 id: %s", sai_serialize_object_id(vlan3_id).c_str());

    SWSS_LOG_NOTICE("1. flush all entries");

    {
        CREATE_ENTRIES();

        SUCCESS(sai_metadata_sai_fdb_api->flush_fdb_entries(switch_id, 0, NULL));

        ASSERT_FDB_NOT_EXISTS(v2bp1d);
        ASSERT_FDB_NOT_EXISTS(v2bp1s);
        ASSERT_FDB_NOT_EXISTS(v2bp2d);
        ASSERT_FDB_NOT_EXISTS(v2bp2s);
        ASSERT_FDB_NOT_EXISTS(v3bp1d);
        ASSERT_FDB_NOT_EXISTS(v3bp1s);
        ASSERT_FDB_NOT_EXISTS(v3bp2d);
        ASSERT_FDB_NOT_EXISTS(v3bp2s);
    }

    SWSS_LOG_NOTICE("2a. flush dynamic entries");

    {
        CREATE_ENTRIES();

        attr.id = SAI_FDB_FLUSH_ATTR_ENTRY_TYPE;
        attr.value.s32 = SAI_FDB_FLUSH_ENTRY_TYPE_DYNAMIC;

        SUCCESS(sai_metadata_sai_fdb_api->flush_fdb_entries(switch_id, 1, &attr));

        ASSERT_FDB_NOT_EXISTS(v2bp1d);
        ASSERT_FDB_EXISTS(v2bp1s);
        ASSERT_FDB_NOT_EXISTS(v2bp2d);
        ASSERT_FDB_EXISTS(v2bp2s);
        ASSERT_FDB_NOT_EXISTS(v3bp1d);
        ASSERT_FDB_EXISTS(v3bp1s);
        ASSERT_FDB_NOT_EXISTS(v3bp2d);
        ASSERT_FDB_EXISTS(v3bp2s);
    }

    SWSS_LOG_NOTICE("2b. flush static entries");

    {
        CREATE_ENTRIES();

        attr.id = SAI_FDB_FLUSH_ATTR_ENTRY_TYPE;
        attr.value.s32 = SAI_FDB_FLUSH_ENTRY_TYPE_STATIC;

        SUCCESS(sai_metadata_sai_fdb_api->flush_fdb_entries(switch_id, 1, &attr));

        ASSERT_FDB_EXISTS(v2bp1d);
        ASSERT_FDB_NOT_EXISTS(v2bp1s);
        ASSERT_FDB_EXISTS(v2bp2d);
        ASSERT_FDB_NOT_EXISTS(v2bp2s);
        ASSERT_FDB_EXISTS(v3bp1d);
        ASSERT_FDB_NOT_EXISTS(v3bp1s);
        ASSERT_FDB_EXISTS(v3bp2d);
        ASSERT_FDB_NOT_EXISTS(v3bp2s);
    }

    SWSS_LOG_NOTICE("3a. flush vlan 2 entries");

    {
        CREATE_ENTRIES();

        attr.id = SAI_FDB_FLUSH_ATTR_BV_ID;
        attr.value.oid = vlan2_id;

        SUCCESS(sai_metadata_sai_fdb_api->flush_fdb_entries(switch_id, 1, &attr));

        ASSERT_FDB_NOT_EXISTS(v2bp1d);
        ASSERT_FDB_NOT_EXISTS(v2bp1s);
        ASSERT_FDB_NOT_EXISTS(v2bp2d);
        ASSERT_FDB_NOT_EXISTS(v2bp2s);
        ASSERT_FDB_EXISTS(v3bp1d);
        ASSERT_FDB_EXISTS(v3bp1s);
        ASSERT_FDB_EXISTS(v3bp2d);
        ASSERT_FDB_EXISTS(v3bp2s);
    }

    SWSS_LOG_NOTICE("3b. flush vlan 3 entries");

    {
        CREATE_ENTRIES();

        attr.id = SAI_FDB_FLUSH_ATTR_BV_ID;
        attr.value.oid = vlan3_id;

        SUCCESS(sai_metadata_sai_fdb_api->flush_fdb_entries(switch_id, 1, &attr));

        ASSERT_FDB_EXISTS(v2bp1d);
        ASSERT_FDB_EXISTS(v2bp1s);
        ASSERT_FDB_EXISTS(v2bp2d);
        ASSERT_FDB_EXISTS(v2bp2s);
        ASSERT_FDB_NOT_EXISTS(v3bp1d);
        ASSERT_FDB_NOT_EXISTS(v3bp1s);
        ASSERT_FDB_NOT_EXISTS(v3bp2d);
        ASSERT_FDB_NOT_EXISTS(v3bp2s);
    }

    SWSS_LOG_NOTICE("4a. flush bridge port 1 entries");

    {
        CREATE_ENTRIES();

        attr.id = SAI_FDB_FLUSH_ATTR_BRIDGE_PORT_ID;
        attr.value.oid = bp1;

        SUCCESS(sai_metadata_sai_fdb_api->flush_fdb_entries(switch_id, 1, &attr));

        ASSERT_FDB_NOT_EXISTS(v2bp1d);
        ASSERT_FDB_NOT_EXISTS(v2bp1s);
        ASSERT_FDB_EXISTS(v2bp2d);
        ASSERT_FDB_EXISTS(v2bp2s);
        ASSERT_FDB_NOT_EXISTS(v3bp1d);
        ASSERT_FDB_NOT_EXISTS(v3bp1s);
        ASSERT_FDB_EXISTS(v3bp2d);
        ASSERT_FDB_EXISTS(v3bp2s);
    }

    SWSS_LOG_NOTICE("4b. flush vlan 3 entries");

    {
        CREATE_ENTRIES();

        attr.id = SAI_FDB_FLUSH_ATTR_BRIDGE_PORT_ID;
        attr.value.oid = bp2;

        SUCCESS(sai_metadata_sai_fdb_api->flush_fdb_entries(switch_id, 1, &attr));

        ASSERT_FDB_EXISTS(v2bp1d);
        ASSERT_FDB_EXISTS(v2bp1s);
        ASSERT_FDB_NOT_EXISTS(v2bp2d);
        ASSERT_FDB_NOT_EXISTS(v2bp2s);
        ASSERT_FDB_EXISTS(v3bp1d);
        ASSERT_FDB_EXISTS(v3bp1s);
        ASSERT_FDB_NOT_EXISTS(v3bp2d);
        ASSERT_FDB_NOT_EXISTS(v3bp2s);
    }

    sai_attribute_t attrs[3];

    SWSS_LOG_NOTICE("5. flush vlan 2 and and type dynamic entries");

    {
        CREATE_ENTRIES();

        attrs[0].id = SAI_FDB_FLUSH_ATTR_ENTRY_TYPE;
        attrs[0].value.s32 = SAI_FDB_FLUSH_ENTRY_TYPE_DYNAMIC;
        attrs[1].id = SAI_FDB_FLUSH_ATTR_BV_ID;
        attrs[1].value.oid = vlan2_id;

        SUCCESS(sai_metadata_sai_fdb_api->flush_fdb_entries(switch_id, 2, attrs));

        ASSERT_FDB_NOT_EXISTS(v2bp1d);
        ASSERT_FDB_EXISTS(v2bp1s);
        ASSERT_FDB_NOT_EXISTS(v2bp2d);
        ASSERT_FDB_EXISTS(v2bp2s);
        ASSERT_FDB_EXISTS(v3bp1d);
        ASSERT_FDB_EXISTS(v3bp1s);
        ASSERT_FDB_EXISTS(v3bp2d);
        ASSERT_FDB_EXISTS(v3bp2s);
    }

    SWSS_LOG_NOTICE("6. flush vlan 2 and and bridge port 2 entries");

    {
        CREATE_ENTRIES();

        attrs[0].id = SAI_FDB_FLUSH_ATTR_BV_ID;
        attrs[0].value.oid = vlan2_id;
        attrs[1].id = SAI_FDB_FLUSH_ATTR_BRIDGE_PORT_ID;
        attrs[1].value.oid = bp2;

        SUCCESS(sai_metadata_sai_fdb_api->flush_fdb_entries(switch_id, 2, attrs));

        ASSERT_FDB_EXISTS(v2bp1d);
        ASSERT_FDB_EXISTS(v2bp1s);
        ASSERT_FDB_NOT_EXISTS(v2bp2d);
        ASSERT_FDB_NOT_EXISTS(v2bp2s);
        ASSERT_FDB_EXISTS(v3bp1d);
        ASSERT_FDB_EXISTS(v3bp1s);
        ASSERT_FDB_EXISTS(v3bp2d);
        ASSERT_FDB_EXISTS(v3bp2s);
    }

    SWSS_LOG_NOTICE("7. flush type dynamic and and bridge port 2 entries");

    {
        CREATE_ENTRIES();

        attrs[0].id = SAI_FDB_FLUSH_ATTR_ENTRY_TYPE;
        attrs[0].value.s32 = SAI_FDB_FLUSH_ENTRY_TYPE_DYNAMIC;
        attrs[1].id = SAI_FDB_FLUSH_ATTR_BRIDGE_PORT_ID;
        attrs[1].value.oid = bp2;

        SUCCESS(sai_metadata_sai_fdb_api->flush_fdb_entries(switch_id, 2, attrs));

        ASSERT_FDB_EXISTS(v2bp1d);
        ASSERT_FDB_EXISTS(v2bp1s);
        ASSERT_FDB_NOT_EXISTS(v2bp2d);
        ASSERT_FDB_EXISTS(v2bp2s);
        ASSERT_FDB_EXISTS(v3bp1d);
        ASSERT_FDB_EXISTS(v3bp1s);
        ASSERT_FDB_NOT_EXISTS(v3bp2d);
        ASSERT_FDB_EXISTS(v3bp2s);
    }

    SWSS_LOG_NOTICE("8. flush type dynamic and and bridge port 2 and vlan 3 entries");

    {
        CREATE_ENTRIES();

        attrs[0].id = SAI_FDB_FLUSH_ATTR_ENTRY_TYPE;
        attrs[0].value.s32 = SAI_FDB_FLUSH_ENTRY_TYPE_DYNAMIC;
        attrs[1].id = SAI_FDB_FLUSH_ATTR_BRIDGE_PORT_ID;
        attrs[1].value.oid = bp2;
        attrs[2].id = SAI_FDB_FLUSH_ATTR_BV_ID;
        attrs[2].value.oid = vlan3_id;

        SUCCESS(sai_metadata_sai_fdb_api->flush_fdb_entries(switch_id, 3, attrs));

        ASSERT_FDB_EXISTS(v2bp1d);
        ASSERT_FDB_EXISTS(v2bp1s);
        ASSERT_FDB_EXISTS(v2bp2d);
        ASSERT_FDB_EXISTS(v2bp2s);
        ASSERT_FDB_EXISTS(v3bp1d);
        ASSERT_FDB_EXISTS(v3bp1s);
        ASSERT_FDB_NOT_EXISTS(v3bp2d);
        ASSERT_FDB_EXISTS(v3bp2s);
    }
}