in meta/Meta.cpp [1854:2053]
void Meta::meta_generic_validation_post_remove(
_In_ const sai_object_meta_key_t& meta_key)
{
SWSS_LOG_ENTER();
if (meta_key.objecttype == SAI_OBJECT_TYPE_SWITCH)
{
/*
* If switch object was removed then meta db was cleared and there are
* no other attributes, no need for reference counting.
*/
clean_after_switch_remove(meta_key.objectkey.key.object_id);
return;
}
// get all attributes that was set
for (auto&it: m_saiObjectCollection.getObject(meta_key)->getAttributes())
{
const sai_attribute_t* attr = it->getSaiAttr();
auto mdp = sai_metadata_get_attr_metadata(meta_key.objecttype, attr->id);
const sai_attribute_value_t& value = attr->value;
const sai_attr_metadata_t& md = *mdp;
// decrease reference on object id types
switch (md.attrvaluetype)
{
case SAI_ATTR_VALUE_TYPE_BOOL:
case SAI_ATTR_VALUE_TYPE_CHARDATA:
case SAI_ATTR_VALUE_TYPE_UINT8:
case SAI_ATTR_VALUE_TYPE_INT8:
case SAI_ATTR_VALUE_TYPE_UINT16:
case SAI_ATTR_VALUE_TYPE_INT16:
case SAI_ATTR_VALUE_TYPE_UINT32:
case SAI_ATTR_VALUE_TYPE_INT32:
case SAI_ATTR_VALUE_TYPE_UINT64:
case SAI_ATTR_VALUE_TYPE_INT64:
case SAI_ATTR_VALUE_TYPE_MAC:
case SAI_ATTR_VALUE_TYPE_IPV4:
case SAI_ATTR_VALUE_TYPE_IPV6:
case SAI_ATTR_VALUE_TYPE_IP_ADDRESS:
case SAI_ATTR_VALUE_TYPE_IP_PREFIX:
case SAI_ATTR_VALUE_TYPE_POINTER:
// primitives, ok
break;
case SAI_ATTR_VALUE_TYPE_OBJECT_ID:
m_oids.objectReferenceDecrement(value.oid);
break;
case SAI_ATTR_VALUE_TYPE_OBJECT_LIST:
m_oids.objectReferenceDecrement(value.objlist);
break;
// ACL FIELD
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_BOOL:
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT8:
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_INT8:
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT16:
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_INT16:
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_INT32:
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT32:
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT64:
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_MAC:
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_IPV4:
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_IPV6:
break;
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_OBJECT_ID:
if (value.aclfield.enable)
{
m_oids.objectReferenceDecrement(value.aclfield.data.oid);
}
break;
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_OBJECT_LIST:
if (value.aclfield.enable)
{
m_oids.objectReferenceDecrement(value.aclfield.data.objlist);
}
break;
// case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT8_LIST:
// ACL ACTION
case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_BOOL:
case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_UINT8:
case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_INT8:
case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_UINT16:
case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_INT16:
case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_UINT32:
case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_INT32:
case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_MAC:
case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_IPV4:
case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_IPV6:
break;
case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_OBJECT_ID:
if (value.aclaction.enable)
{
m_oids.objectReferenceDecrement(value.aclaction.parameter.oid);
}
break;
case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_OBJECT_LIST:
if (value.aclaction.enable)
{
m_oids.objectReferenceDecrement(value.aclaction.parameter.objlist);
}
break;
// ACL END
case SAI_ATTR_VALUE_TYPE_UINT8_LIST:
case SAI_ATTR_VALUE_TYPE_INT8_LIST:
case SAI_ATTR_VALUE_TYPE_UINT16_LIST:
case SAI_ATTR_VALUE_TYPE_INT16_LIST:
case SAI_ATTR_VALUE_TYPE_UINT32_LIST:
case SAI_ATTR_VALUE_TYPE_INT32_LIST:
case SAI_ATTR_VALUE_TYPE_QOS_MAP_LIST:
case SAI_ATTR_VALUE_TYPE_MAP_LIST:
case SAI_ATTR_VALUE_TYPE_IP_ADDRESS_LIST:
case SAI_ATTR_VALUE_TYPE_UINT32_RANGE:
case SAI_ATTR_VALUE_TYPE_INT32_RANGE:
case SAI_ATTR_VALUE_TYPE_ACL_RESOURCE_LIST:
case SAI_ATTR_VALUE_TYPE_SEGMENT_LIST:
case SAI_ATTR_VALUE_TYPE_UINT16_RANGE_LIST:
case SAI_ATTR_VALUE_TYPE_JSON:
// no special action required
break;
case SAI_ATTR_VALUE_TYPE_MACSEC_SAK:
case SAI_ATTR_VALUE_TYPE_MACSEC_AUTH_KEY:
case SAI_ATTR_VALUE_TYPE_MACSEC_SALT:
case SAI_ATTR_VALUE_TYPE_MACSEC_SCI:
case SAI_ATTR_VALUE_TYPE_MACSEC_SSCI:
break;
case SAI_ATTR_VALUE_TYPE_SYSTEM_PORT_CONFIG:
case SAI_ATTR_VALUE_TYPE_SYSTEM_PORT_CONFIG_LIST:
// no special action required
break;
case SAI_ATTR_VALUE_TYPE_IP_PREFIX_LIST:
// no special action required
break;
default:
META_LOG_THROW(md, "serialization type is not supported yet FIXME");
}
}
// we don't keep track of fdb, neighbor, route since
// those are safe to remove any time (leafs)
auto info = sai_metadata_get_object_type_info(meta_key.objecttype);
if (info->isnonobjectid)
{
/*
* Decrease object reference count for all object ids in non object id
* members.
*/
for (size_t j = 0; j < info->structmemberscount; ++j)
{
const sai_struct_member_info_t *m = info->structmembers[j];
if (m->membervaluetype != SAI_ATTR_VALUE_TYPE_OBJECT_ID)
{
continue;
}
m_oids.objectReferenceDecrement(m->getoid(&meta_key));
}
}
else
{
m_oids.objectReferenceRemove(meta_key.objectkey.key.object_id);
}
m_saiObjectCollection.removeObject(meta_key);
std::string metaKey = sai_serialize_object_meta_key(meta_key);
m_attrKeys.eraseMetaKey(metaKey);
if (meta_key.objecttype == SAI_OBJECT_TYPE_PORT)
{
post_port_remove(meta_key);
}
}