|
13 | 13 | #include "swss/select.h"
|
14 | 14 | #include "swss/tokenize.h"
|
15 | 15 |
|
| 16 | +#include <iterator> |
| 17 | +#include <algorithm> |
| 18 | + |
16 | 19 | using namespace sairedis;
|
17 | 20 | using namespace saimeta;
|
18 | 21 | using namespace std::placeholders;
|
@@ -698,14 +701,14 @@ sai_status_t ServerSai::processSingleEvent(
|
698 | 701 | // if (op == REDIS_ASIC_STATE_COMMAND_FLUSH)
|
699 | 702 | // return processFdbFlush(kco);
|
700 | 703 | //
|
701 |
| -// if (op == REDIS_ASIC_STATE_COMMAND_ATTR_CAPABILITY_QUERY) |
702 |
| -// return processAttrCapabilityQuery(kco); |
703 |
| -// |
704 |
| -// if (op == REDIS_ASIC_STATE_COMMAND_ATTR_ENUM_VALUES_CAPABILITY_QUERY) |
705 |
| -// return processAttrEnumValuesCapabilityQuery(kco); |
706 |
| -// |
707 |
| -// if (op == REDIS_ASIC_STATE_COMMAND_OBJECT_TYPE_GET_AVAILABILITY_QUERY) |
708 |
| -// return processObjectTypeGetAvailabilityQuery(kco); |
| 704 | + if (op == REDIS_ASIC_STATE_COMMAND_ATTR_CAPABILITY_QUERY) |
| 705 | + return processAttrCapabilityQuery(kco); |
| 706 | + |
| 707 | + if (op == REDIS_ASIC_STATE_COMMAND_ATTR_ENUM_VALUES_CAPABILITY_QUERY) |
| 708 | + return processAttrEnumValuesCapabilityQuery(kco); |
| 709 | + |
| 710 | + if (op == REDIS_ASIC_STATE_COMMAND_OBJECT_TYPE_GET_AVAILABILITY_QUERY) |
| 711 | + return processObjectTypeGetAvailabilityQuery(kco); |
709 | 712 |
|
710 | 713 | SWSS_LOG_THROW("event op '%s' is not implemented, FIXME", op.c_str());
|
711 | 714 | }
|
@@ -1539,3 +1542,168 @@ void ServerSai::sendBulkApiResponse(
|
1539 | 1542 |
|
1540 | 1543 | m_selectableChannel->set(strStatus, entry, REDIS_ASIC_STATE_COMMAND_GETRESPONSE);
|
1541 | 1544 | }
|
| 1545 | + |
| 1546 | +sai_status_t ServerSai::processAttrCapabilityQuery( |
| 1547 | + _In_ const swss::KeyOpFieldsValuesTuple &kco) |
| 1548 | +{ |
| 1549 | + SWSS_LOG_ENTER(); |
| 1550 | + |
| 1551 | + auto& strSwitchOid = kfvKey(kco); |
| 1552 | + |
| 1553 | + sai_object_id_t switchOid; |
| 1554 | + sai_deserialize_object_id(strSwitchOid, switchOid); |
| 1555 | + |
| 1556 | + auto& values = kfvFieldsValues(kco); |
| 1557 | + |
| 1558 | + if (values.size() != 2) |
| 1559 | + { |
| 1560 | + SWSS_LOG_ERROR("Invalid input: expected 2 arguments, received %zu", values.size()); |
| 1561 | + |
| 1562 | + m_selectableChannel->set(sai_serialize_status(SAI_STATUS_INVALID_PARAMETER), {}, REDIS_ASIC_STATE_COMMAND_ATTR_CAPABILITY_RESPONSE); |
| 1563 | + |
| 1564 | + return SAI_STATUS_INVALID_PARAMETER; |
| 1565 | + } |
| 1566 | + |
| 1567 | + sai_object_type_t objectType; |
| 1568 | + sai_deserialize_object_type(fvValue(values[0]), objectType); |
| 1569 | + |
| 1570 | + sai_attr_id_t attrId; |
| 1571 | + sai_deserialize_attr_id(fvValue(values[1]), attrId); |
| 1572 | + |
| 1573 | + sai_attr_capability_t capability; |
| 1574 | + |
| 1575 | + sai_status_t status = m_sai->queryAttributeCapability(switchOid, objectType, attrId, &capability); |
| 1576 | + |
| 1577 | + std::vector<swss::FieldValueTuple> entry; |
| 1578 | + |
| 1579 | + if (status == SAI_STATUS_SUCCESS) |
| 1580 | + { |
| 1581 | + entry = |
| 1582 | + { |
| 1583 | + swss::FieldValueTuple("CREATE_IMPLEMENTED", (capability.create_implemented ? "true" : "false")), |
| 1584 | + swss::FieldValueTuple("SET_IMPLEMENTED", (capability.set_implemented ? "true" : "false")), |
| 1585 | + swss::FieldValueTuple("GET_IMPLEMENTED", (capability.get_implemented ? "true" : "false")) |
| 1586 | + }; |
| 1587 | + |
| 1588 | + SWSS_LOG_INFO("Sending response: create_implemented:%d, set_implemented:%d, get_implemented:%d", |
| 1589 | + capability.create_implemented, capability.set_implemented, capability.get_implemented); |
| 1590 | + } |
| 1591 | + |
| 1592 | + m_selectableChannel->set(sai_serialize_status(status), entry, REDIS_ASIC_STATE_COMMAND_ATTR_CAPABILITY_RESPONSE); |
| 1593 | + |
| 1594 | + return status; |
| 1595 | +} |
| 1596 | + |
| 1597 | +sai_status_t ServerSai::processAttrEnumValuesCapabilityQuery( |
| 1598 | + _In_ const swss::KeyOpFieldsValuesTuple &kco) |
| 1599 | +{ |
| 1600 | + SWSS_LOG_ENTER(); |
| 1601 | + |
| 1602 | + auto& strSwitchOid = kfvKey(kco); |
| 1603 | + |
| 1604 | + sai_object_id_t switchOid; |
| 1605 | + sai_deserialize_object_id(strSwitchOid, switchOid); |
| 1606 | + |
| 1607 | + auto& values = kfvFieldsValues(kco); |
| 1608 | + |
| 1609 | + if (values.size() != 3) |
| 1610 | + { |
| 1611 | + SWSS_LOG_ERROR("Invalid input: expected 3 arguments, received %zu", values.size()); |
| 1612 | + |
| 1613 | + m_selectableChannel->set(sai_serialize_status(SAI_STATUS_INVALID_PARAMETER), {}, REDIS_ASIC_STATE_COMMAND_ATTR_ENUM_VALUES_CAPABILITY_RESPONSE); |
| 1614 | + |
| 1615 | + return SAI_STATUS_INVALID_PARAMETER; |
| 1616 | + } |
| 1617 | + |
| 1618 | + sai_object_type_t objectType; |
| 1619 | + sai_deserialize_object_type(fvValue(values[0]), objectType); |
| 1620 | + |
| 1621 | + sai_attr_id_t attrId; |
| 1622 | + sai_deserialize_attr_id(fvValue(values[1]), attrId); |
| 1623 | + |
| 1624 | + uint32_t list_size = std::stoi(fvValue(values[2])); |
| 1625 | + |
| 1626 | + std::vector<int32_t> enum_capabilities_list(list_size); |
| 1627 | + |
| 1628 | + sai_s32_list_t enumCapList; |
| 1629 | + |
| 1630 | + enumCapList.count = list_size; |
| 1631 | + enumCapList.list = enum_capabilities_list.data(); |
| 1632 | + |
| 1633 | + sai_status_t status = m_sai->queryAattributeEnumValuesCapability(switchOid, objectType, attrId, &enumCapList); |
| 1634 | + |
| 1635 | + std::vector<swss::FieldValueTuple> entry; |
| 1636 | + |
| 1637 | + if (status == SAI_STATUS_SUCCESS) |
| 1638 | + { |
| 1639 | + std::vector<std::string> vec; |
| 1640 | + std::transform(enumCapList.list, enumCapList.list + enumCapList.count, |
| 1641 | + std::back_inserter(vec), [](auto&e) { return std::to_string(e); }); |
| 1642 | + |
| 1643 | + std::ostringstream join; |
| 1644 | + std::copy(vec.begin(), vec.end(), std::ostream_iterator<std::string>(join, ",")); |
| 1645 | + |
| 1646 | + auto strCap = join.str(); |
| 1647 | + |
| 1648 | + entry = |
| 1649 | + { |
| 1650 | + swss::FieldValueTuple("ENUM_CAPABILITIES", strCap), |
| 1651 | + swss::FieldValueTuple("ENUM_COUNT", std::to_string(enumCapList.count)) |
| 1652 | + }; |
| 1653 | + |
| 1654 | + SWSS_LOG_DEBUG("Sending response: capabilities = '%s', count = %d", strCap.c_str(), enumCapList.count); |
| 1655 | + } |
| 1656 | + |
| 1657 | + m_selectableChannel->set(sai_serialize_status(status), entry, REDIS_ASIC_STATE_COMMAND_ATTR_ENUM_VALUES_CAPABILITY_RESPONSE); |
| 1658 | + |
| 1659 | + return status; |
| 1660 | +} |
| 1661 | + |
| 1662 | +sai_status_t ServerSai::processObjectTypeGetAvailabilityQuery( |
| 1663 | + _In_ const swss::KeyOpFieldsValuesTuple &kco) |
| 1664 | +{ |
| 1665 | + SWSS_LOG_ENTER(); |
| 1666 | + |
| 1667 | + auto& strSwitchOid = kfvKey(kco); |
| 1668 | + |
| 1669 | + sai_object_id_t switchOid; |
| 1670 | + sai_deserialize_object_id(strSwitchOid, switchOid); |
| 1671 | + |
| 1672 | + std::vector<swss::FieldValueTuple> values = kfvFieldsValues(kco); |
| 1673 | + |
| 1674 | + // needs to pop the object type off the end of the list in order to |
| 1675 | + // retrieve the attribute list |
| 1676 | + |
| 1677 | + sai_object_type_t objectType; |
| 1678 | + sai_deserialize_object_type(fvValue(values.back()), objectType); |
| 1679 | + |
| 1680 | + values.pop_back(); |
| 1681 | + |
| 1682 | + SaiAttributeList list(objectType, values, false); |
| 1683 | + |
| 1684 | + sai_attribute_t *attr_list = list.get_attr_list(); |
| 1685 | + |
| 1686 | + uint32_t attr_count = list.get_attr_count(); |
| 1687 | + |
| 1688 | + uint64_t count; |
| 1689 | + |
| 1690 | + sai_status_t status = m_sai->objectTypeGetAvailability( |
| 1691 | + switchOid, |
| 1692 | + objectType, |
| 1693 | + attr_count, |
| 1694 | + attr_list, |
| 1695 | + &count); |
| 1696 | + |
| 1697 | + std::vector<swss::FieldValueTuple> entry; |
| 1698 | + |
| 1699 | + if (status == SAI_STATUS_SUCCESS) |
| 1700 | + { |
| 1701 | + entry.push_back(swss::FieldValueTuple("OBJECT_COUNT", std::to_string(count))); |
| 1702 | + |
| 1703 | + SWSS_LOG_DEBUG("Sending response: count = %lu", count); |
| 1704 | + } |
| 1705 | + |
| 1706 | + m_selectableChannel->set(sai_serialize_status(status), entry, REDIS_ASIC_STATE_COMMAND_OBJECT_TYPE_GET_AVAILABILITY_RESPONSE); |
| 1707 | + |
| 1708 | + return status; |
| 1709 | +} |
0 commit comments