void process_object_type_attributes( _In_ const sai_attr_metadata_t** meta_attr_list, _In_ sai_object_type_t current_object_type) { std::set<sai_object_type_t> otset; for (int i = 0; meta_attr_list[i] != NULL; ++i) { const sai_attr_metadata_t* meta = meta_attr_list[i]; if (meta->allowedobjecttypeslength == 0) { // skip attributes that don't contain object id's continue; } if (HAS_FLAG_READ_ONLY(meta->flags)) { // skip attributes that are read only continue; } std::string style; switch (meta->attrvaluetype) { case SAI_ATTR_VALUE_TYPE_OBJECT_LIST: case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_OBJECT_LIST: case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_OBJECT_LIST: // we can miss some objects if same object can be set // as list in one attribute and as single object in // another attribute style = "style=bold"; break; default: break; } // this attribute supports objects if (meta->allowedobjecttypeslength > 1) { // point arrows to the same point origin when this is single attribute style += " samehead=" + std::string(meta->attridname); } for (uint32_t j = 0; j < meta->allowedobjecttypeslength; j++) { sai_object_type_t ot = meta->allowedobjecttypes[j]; if (otset.find(ot) != otset.end()) { // node was already defined continue; } const char* current = NN(current_object_type); const char* dep = NN(ot); std::cout << dep << " -> " << current << " [ " << style << " color=\"0.650 0.700 0.700\"];\n"; otset.insert(ot); source.insert(ot); target.insert(current_object_type); } } }
sai_status_t internal_vs_generic_get( _In_ sai_object_type_t object_type, _In_ const std::string &serialized_object_id, _In_ sai_object_id_t switch_id, _In_ uint32_t attr_count, _Out_ sai_attribute_t *attr_list) { SWSS_LOG_ENTER(); auto &objectHash = g_switch_state_map.at(switch_id)->objectHash.at(object_type); auto it = objectHash.find(serialized_object_id); if (it == objectHash.end()) { SWSS_LOG_ERROR("not found %s:%s", sai_serialize_object_type(object_type).c_str(), serialized_object_id.c_str()); return SAI_STATUS_ITEM_NOT_FOUND; } /* * We need reference here since we can potentially update attr hash for RO * object. */ AttrHash& attrHash = it->second; /* * Some of the list query maybe for length, so we can't do * normal serialize, maybe with count only. */ sai_status_t final_status = SAI_STATUS_SUCCESS; for (uint32_t idx = 0; idx < attr_count; ++idx) { sai_attr_id_t id = attr_list[idx].id; auto meta = sai_metadata_get_attr_metadata(object_type, id); if (meta == NULL) { SWSS_LOG_ERROR("failed to find attribute %d for %s:%s", id, sai_serialize_object_type(object_type).c_str(), serialized_object_id.c_str()); return SAI_STATUS_FAILURE; } sai_status_t status; if (HAS_FLAG_READ_ONLY(meta->flags)) { /* * Read only attributes may require recalculation. * Metadata makes sure that non object id's can't have * read only attributes. So here is defenetly OID. */ sai_object_id_t oid; sai_deserialize_object_id(serialized_object_id, oid); status = refresh_read_only(meta, oid, switch_id); if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("%s read only not implemented on %s", meta->attridname, serialized_object_id.c_str()); return status; } } auto ait = attrHash.find(meta->attridname); if (ait == attrHash.end()) { SWSS_LOG_ERROR("%s not implemented on %s", meta->attridname, serialized_object_id.c_str()); return SAI_STATUS_NOT_IMPLEMENTED; } auto attr = ait->second->getAttr(); status = transfer_attributes(object_type, 1, attr, &attr_list[idx], false); if (status == SAI_STATUS_BUFFER_OVERFLOW) { /* * This is considered partial success, since we get correct list * length. Note that other items ARE processes on the list. */ SWSS_LOG_NOTICE("BUFFER_OVERFLOW %s: %s", serialized_object_id.c_str(), meta->attridname); /* * We still continue processing other attributes for get as long as * we only will be getting buffer overflow error. */ final_status = status; continue; } if (status != SAI_STATUS_SUCCESS) { // all other errors SWSS_LOG_ERROR("get failed %s: %s: %s", serialized_object_id.c_str(), meta->attridname, sai_serialize_status(status).c_str()); return status; } } return final_status; }