void check_object_ro_list()

in meta/saisanitycheck.c [4941:5025]


void check_object_ro_list(
        _In_ const sai_object_type_info_t *oi)
{
    META_LOG_ENTER();

    /*
     * Purpose is to check if object is referenced in any other object as read
     * only attribute to know that we can get all objects of this type.
     * Example: VLAN and VLAN_MEMBER. All vlan members are listed on attribute:
     * SAI_VLAN_ATTR_MEMBER_LIST.
     *
     * Should we only check that for leaf objects?
     */

    if (oi->isnonobjectid)
    {
        return;
    }

    if (oi->objecttype == SAI_OBJECT_TYPE_FDB_FLUSH ||
            oi->objecttype == SAI_OBJECT_TYPE_HOSTIF_PACKET ||
            oi->objecttype == SAI_OBJECT_TYPE_SWITCH ||
            oi->objecttype == SAI_OBJECT_TYPE_BFD_SESSION ||
            oi->objecttype == SAI_OBJECT_TYPE_HOSTIF_TABLE_ENTRY ||
            oi->objecttype == SAI_OBJECT_TYPE_DTEL ||
            oi->objecttype == SAI_OBJECT_TYPE_DTEL_QUEUE_REPORT ||
            oi->objecttype == SAI_OBJECT_TYPE_DTEL_EVENT ||
            oi->objecttype == SAI_OBJECT_TYPE_GENERIC_PROGRAMMABLE ||
            oi->objecttype == SAI_OBJECT_TYPE_TWAMP_SESSION ||
            oi->objecttype == SAI_OBJECT_TYPE_ICMP_ECHO_SESSION)
    {
        /*
         * We skip hostif table entry since there is no 1 object which can
         * identify all table entries. We would need to add one attribute for
         * each used object type port, lag, vlan etc.
         */

        return;
    }

    size_t idx = 0;

    for (; idx < sai_metadata_attr_sorted_by_id_name_count; ++idx)
    {
        const sai_attr_metadata_t *meta = sai_metadata_attr_sorted_by_id_name[idx];

        if (sai_metadata_is_allowed_object_type(meta, oi->objecttype))
        {
            if (oi->revgraphmembers != 0)
            {
                /* this object is not leaf, so it must be used as attribute */
                return;
            }
        }

        if (meta->attrvaluetype != SAI_ATTR_VALUE_TYPE_OBJECT_LIST)
        {
            continue;
        }

        if (!meta->isreadonly)
        {
            continue;
        }

        if (sai_metadata_is_allowed_object_type(meta, oi->objecttype))
        {
            return;
        }
    }

    if (oi->isexperimental)
    {
        META_LOG_DEBUG("experimental object %s not present on any object list (eg. VLAN_MEMBER is present on SAI_VLAN_ATTR_MEMBER_LIST)", oi->objecttypename);
        return;
    }

    if (SAI_OBJECT_TYPE_DEBUG_COUNTER == oi->objecttype)
    {
        META_LOG_WARN("debug counter object %s not present on any object list (eg. VLAN_MEMBER is present on SAI_VLAN_ATTR_MEMBER_LIST)", oi->objecttypename);
        return;
    }

    META_ASSERT_FAIL("%s not present on any object list (eg. VLAN_MEMBER is present on SAI_VLAN_ATTR_MEMBER_LIST)", oi->objecttypename);
}