void convert_attr_sai_to_thrift()

in meta/sai_rpc_frontend.cpp [605:860]


void convert_attr_sai_to_thrift(
        const sai_object_type_t ot,
        const sai_attribute_t &attr,
        sai_thrift_attribute_t &thrift_attr)
{
    const auto md = sai_metadata_get_attr_metadata(ot, attr.id);

    thrift_attr.id = attr.id;

    sai_thrift_exception e;

    e.status = SAI_STATUS_NOT_SUPPORTED;

    if (md == NULL)
    {
        SAI_META_LOG_ERROR("attr metadata not found for object type %d and attribute %d", ot, attr.id);
        e.status = SAI_STATUS_INVALID_PARAMETER;
        throw e;
    }

    switch (md->attrvaluetype)
    {
        case SAI_ATTR_VALUE_TYPE_BOOL:
            thrift_attr.value.booldata = attr.value.booldata;
            break;
        case SAI_ATTR_VALUE_TYPE_CHARDATA:
            thrift_attr.value.chardata = attr.value.chardata;
            break;
        case SAI_ATTR_VALUE_TYPE_UINT8:
            thrift_attr.value.u8 = attr.value.u8;
            break;
        case SAI_ATTR_VALUE_TYPE_INT8:
            thrift_attr.value.s8 = attr.value.s8;
            break;
        case SAI_ATTR_VALUE_TYPE_UINT16:
            thrift_attr.value.u16 = attr.value.u16;
            break;
        case SAI_ATTR_VALUE_TYPE_INT16:
            thrift_attr.value.s16 = attr.value.s16;
            break;
        case SAI_ATTR_VALUE_TYPE_UINT32:
            thrift_attr.value.u32 = attr.value.u32;
            break;
        case SAI_ATTR_VALUE_TYPE_INT32:
            thrift_attr.value.s32 = attr.value.s32;
            break;
        case SAI_ATTR_VALUE_TYPE_UINT64:
            thrift_attr.value.u64 = attr.value.u64;
            break;
        case SAI_ATTR_VALUE_TYPE_INT64:
            thrift_attr.value.s64 = attr.value.s64;
            break;
        case SAI_ATTR_VALUE_TYPE_MAC:
            {
                char mac_str[18];
                snprintf(mac_str,
                        sizeof(mac_str),
                        "%02x:%02x:%02x:%02x:%02x:%02x",
                        attr.value.mac[0],
                        attr.value.mac[1],
                        attr.value.mac[2],
                        attr.value.mac[3],
                        attr.value.mac[4],
                        attr.value.mac[5]);
                thrift_attr.value.mac = mac_str;
            }
            break;
        case SAI_ATTR_VALUE_TYPE_IPV4:
            thrift_attr.value.ip4 = sai_ip4_t_to_thrift(attr.value.ip4);
            break;
        case SAI_ATTR_VALUE_TYPE_IPV6:
            thrift_attr.value.ip6 = sai_ip6_t_to_thrift(attr.value.ip6);
            break;
        case SAI_ATTR_VALUE_TYPE_IP_ADDRESS:
            sai_ip_address_t_to_thrift(thrift_attr.value.ipaddr, attr.value.ipaddr);
            break;
        case SAI_ATTR_VALUE_TYPE_IP_PREFIX:
            sai_ip_prefix_t_to_thrift(thrift_attr.value.ipprefix, attr.value.ipprefix);
            break;
        case SAI_ATTR_VALUE_TYPE_OBJECT_ID:
            thrift_attr.value.oid = attr.value.oid;
            break;
        case SAI_ATTR_VALUE_TYPE_OBJECT_LIST:
            {
                for (unsigned int i = 0; i < attr.value.objlist.count; i++)
                {
                    thrift_attr.value.objlist.idlist.push_back(attr.value.objlist.list[i]);
                }
                thrift_attr.value.objlist.count = attr.value.objlist.count;
                free(attr.value.objlist.list);
            }
            break;
        case SAI_ATTR_VALUE_TYPE_UINT8_LIST:
            {
                for (unsigned int i = 0; i < attr.value.u8list.count; i++)
                {
                    thrift_attr.value.u8list.uint8list.push_back(attr.value.u8list.list[i]);
                }
                thrift_attr.value.u8list.count = attr.value.u8list.count;
                free(attr.value.u8list.list);
            }
            break;
        case SAI_ATTR_VALUE_TYPE_INT8_LIST:
            {
                for (unsigned int i = 0; i < attr.value.s8list.count; i++)
                {
                    thrift_attr.value.s8list.int8list.push_back(attr.value.s8list.list[i]);
                }
                thrift_attr.value.s8list.count = attr.value.s8list.count;
                free(attr.value.s8list.list);
            }
            break;
        case SAI_ATTR_VALUE_TYPE_UINT16_LIST:
            {
                for (unsigned int i = 0; i < attr.value.u16list.count; i++)
                {
                    thrift_attr.value.u16list.uint16list.push_back(attr.value.u16list.list[i]);
                }
                thrift_attr.value.u16list.count = attr.value.u16list.count;
                free(attr.value.u16list.list);
            }
            break;
        case SAI_ATTR_VALUE_TYPE_INT16_LIST:
            {
                for (unsigned int i = 0; i < attr.value.s16list.count; i++)
                {
                    thrift_attr.value.s16list.int16list.push_back(attr.value.s16list.list[i]);
                }
                thrift_attr.value.s16list.count = attr.value.s16list.count;
                free(attr.value.s16list.list);
            }
            break;
        case SAI_ATTR_VALUE_TYPE_UINT32_LIST:
            {
                for (unsigned int i = 0; i < attr.value.u32list.count; i++)
                {
                    thrift_attr.value.u32list.uint32list.push_back(attr.value.u32list.list[i]);
                }
                thrift_attr.value.u32list.count = attr.value.u32list.count;
                free(attr.value.u32list.list);
            }
            break;
        case SAI_ATTR_VALUE_TYPE_INT32_LIST:
            {
                for (unsigned int i = 0; i < attr.value.s32list.count; i++)
                {
                    thrift_attr.value.s32list.int32list.push_back(attr.value.s32list.list[i]);
                }
                thrift_attr.value.s32list.count = attr.value.s32list.count;
                free(attr.value.s32list.list);
            }
            break;
        case SAI_ATTR_VALUE_TYPE_UINT32_RANGE:
            thrift_attr.value.u32range.min = attr.value.u32range.min;
            thrift_attr.value.u32range.max = attr.value.u32range.max;
            break;
        case SAI_ATTR_VALUE_TYPE_INT32_RANGE:
            thrift_attr.value.s32range.min = attr.value.s32range.min;
            thrift_attr.value.s32range.max = attr.value.s32range.max;
            break;
        case SAI_ATTR_VALUE_TYPE_UINT16_RANGE_LIST:
            {
                for (unsigned int i = 0; i < attr.value.u16rangelist.count; i++)
                {
                    sai_thrift_u16_range_t range;
                    range.min = attr.value.u16rangelist.list[i].min;
                    range.max = attr.value.u16rangelist.list[i].max;
                    thrift_attr.value.u16rangelist.rangelist.push_back(range);
                }
                thrift_attr.value.u16rangelist.count = attr.value.u16rangelist.count;
                free(attr.value.u16rangelist.list);
            }
            break;

        case SAI_ATTR_VALUE_TYPE_ACL_CAPABILITY:
            {
                for (unsigned int i = 0; i < attr.value.aclcapability.action_list.count; i++)
                {
                    thrift_attr.value.aclcapability.action_list.int32list.push_back(attr.value.aclcapability.action_list.list[i]);
                }
                thrift_attr.value.aclcapability.action_list.count = attr.value.aclcapability.action_list.count;
                free(attr.value.aclcapability.action_list.list);
            }
            break;
        case SAI_ATTR_VALUE_TYPE_ACL_RESOURCE_LIST:
            {
                for (unsigned int i = 0; i < attr.value.aclresource.count; i++)
                {
                    sai_thrift_acl_resource_t resource = {};
                    resource.stage = attr.value.aclresource.list[i].stage;
                    resource.bind_point = attr.value.aclresource.list[i].bind_point;
                    resource.avail_num = attr.value.aclresource.list[i].avail_num;
                    thrift_attr.value.aclresource.resourcelist.push_back(resource);
                }
                thrift_attr.value.aclresource.count = attr.value.aclresource.count;
                free(attr.value.aclresource.list);
            }
            break;
        case SAI_ATTR_VALUE_TYPE_IP_ADDRESS_LIST:
            {
                for (unsigned int i = 0; i < attr.value.ipaddrlist.count; i++)
                {
                    sai_thrift_ip_address_t thrift_ip;
                    sai_ip_address_t_to_thrift(thrift_ip, attr.value.ipaddrlist.list[i]);
                    thrift_attr.value.ipaddrlist.addresslist.push_back(thrift_ip);
                }
                thrift_attr.value.ipaddrlist.count = attr.value.ipaddrlist.count;
                free(attr.value.ipaddrlist.list);
            }
            break;
        case SAI_ATTR_VALUE_TYPE_IP_PREFIX_LIST:
            {
                for (unsigned int i = 0; i < attr.value.ipprefixlist.count; i++)
                {
                    sai_thrift_ip_prefix_t thrift_ip;
                    sai_ip_prefix_t_to_thrift(thrift_ip, attr.value.ipprefix);
                    thrift_attr.value.ipprefixlist.prefixlist.push_back(thrift_ip);
                }
                thrift_attr.value.ipprefixlist.count = attr.value.ipprefixlist.count;
                free(attr.value.ipprefixlist.list);
            }
            break;
        case SAI_ATTR_VALUE_TYPE_QOS_MAP_LIST:
            {
                for (unsigned int i = 0; i < attr.value.qosmap.count; i++)
                {
                    sai_thrift_qos_map_t thrift_qos_map;
                    // key
                    thrift_qos_map.key.tc = attr.value.qosmap.list[i].key.tc;
                    thrift_qos_map.key.dscp = attr.value.qosmap.list[i].key.dscp;
                    thrift_qos_map.key.dot1p = attr.value.qosmap.list[i].key.dot1p;
                    thrift_qos_map.key.prio = attr.value.qosmap.list[i].key.prio;
                    thrift_qos_map.key.pg = attr.value.qosmap.list[i].key.pg;
                    thrift_qos_map.key.queue_index = attr.value.qosmap.list[i].key.queue_index;
                    thrift_qos_map.key.color = static_cast<int32_t>(attr.value.qosmap.list[i].key.color);
                    thrift_qos_map.key.mpls_exp = attr.value.qosmap.list[i].key.mpls_exp;
                    // value
                    thrift_qos_map.value.tc = attr.value.qosmap.list[i].value.tc;
                    thrift_qos_map.value.dscp = attr.value.qosmap.list[i].value.dscp;
                    thrift_qos_map.value.dot1p = attr.value.qosmap.list[i].value.dot1p;
                    thrift_qos_map.value.prio = attr.value.qosmap.list[i].value.prio;
                    thrift_qos_map.value.pg = attr.value.qosmap.list[i].value.pg;
                    thrift_qos_map.value.queue_index = attr.value.qosmap.list[i].value.queue_index;
                    thrift_qos_map.value.color = static_cast<int32_t>(attr.value.qosmap.list[i].value.color);
                    thrift_qos_map.value.mpls_exp = attr.value.qosmap.list[i].value.mpls_exp;
                    thrift_attr.value.qosmap.maplist.push_back(thrift_qos_map);
                }
                thrift_attr.value.qosmap.count = attr.value.qosmap.count;
                free(attr.value.qosmap.list);
            }
            break;
        default:
            SAI_META_LOG_ERROR("attr value type not supported for %s", md->attridname);
            throw e;
    }
}