in meta/Meta.cpp [5930:6159]
void Meta::meta_generic_validation_post_set(
_In_ const sai_object_meta_key_t& meta_key,
_In_ const sai_attribute_t *attr)
{
SWSS_LOG_ENTER();
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;
/*
* TODO We need to get previous value and make deal with references, check
* if there is default value and if it's const.
*/
if (!SAI_HAS_FLAG_READ_ONLY(md.flags) && md.isoidattribute)
{
if ((get_object_previous_attr(meta_key, md) == NULL) &&
(md.defaultvaluetype != SAI_DEFAULT_VALUE_TYPE_CONST &&
md.defaultvaluetype != SAI_DEFAULT_VALUE_TYPE_EMPTY_LIST))
{
/*
* If default value type will be internal then we should warn.
*/
// XXX produces too much noise
// META_LOG_WARN(md, "post set, not in local db, FIX snoop!: %s",
// sai_serialize_object_meta_key(meta_key).c_str());
}
}
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_POINTER:
case SAI_ATTR_VALUE_TYPE_IP_ADDRESS:
case SAI_ATTR_VALUE_TYPE_IP_PREFIX:
// primitives, ok
break;
case SAI_ATTR_VALUE_TYPE_OBJECT_ID:
{
auto prev = get_object_previous_attr(meta_key, md);
if (prev != NULL)
{
// decrease previous if it was set
m_oids.objectReferenceDecrement(prev->getSaiAttr()->value.oid);
}
m_oids.objectReferenceIncrement(value.oid);
break;
}
case SAI_ATTR_VALUE_TYPE_OBJECT_LIST:
{
auto prev = get_object_previous_attr(meta_key, md);
if (prev != NULL)
{
// decrease previous if it was set
m_oids.objectReferenceDecrement(prev->getSaiAttr()->value.objlist);
}
m_oids.objectReferenceIncrement(value.objlist);
break;
}
// case SAI_ATTR_VALUE_TYPE_VLAN_LIST:
// will require increase vlan references
// 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_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:
{
auto prev = get_object_previous_attr(meta_key, md);
if (prev)
{
// decrease previous if it was set
if (prev->getSaiAttr()->value.aclfield.enable)
m_oids.objectReferenceDecrement(prev->getSaiAttr()->value.aclfield.data.oid);
}
if (value.aclfield.enable)
m_oids.objectReferenceIncrement(value.aclfield.data.oid);
break;
}
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_OBJECT_LIST:
{
auto prev = get_object_previous_attr(meta_key, md);
if (prev)
{
// decrease previous if it was set
if (prev->getSaiAttr()->value.aclfield.enable)
m_oids.objectReferenceDecrement(prev->getSaiAttr()->value.aclfield.data.objlist);
}
if (value.aclfield.enable)
m_oids.objectReferenceIncrement(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:
// primitives
break;
case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_OBJECT_ID:
{
auto prev = get_object_previous_attr(meta_key, md);
if (prev)
{
// decrease previous if it was set
if (prev->getSaiAttr()->value.aclaction.enable)
m_oids.objectReferenceDecrement(prev->getSaiAttr()->value.aclaction.parameter.oid);
}
if (value.aclaction.enable)
m_oids.objectReferenceIncrement(value.aclaction.parameter.oid);
break;
}
case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_OBJECT_LIST:
{
auto prev = get_object_previous_attr(meta_key, md);
if (prev)
{
// decrease previous if it was set
if (prev->getSaiAttr()->value.aclaction.enable)
m_oids.objectReferenceDecrement(prev->getSaiAttr()->value.aclaction.parameter.objlist);
}
if (value.aclaction.enable)
m_oids.objectReferenceIncrement(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_ACL_CAPABILITY:
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_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");
}
// only on create we need to increase entry object types members
// save actual attributes and values to local db
m_saiObjectCollection.setObjectAttr(meta_key, md, attr);
}