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;
}
}