Re: [PATCH iproute2-next v1 2/3] rdma: Add stat "mode" support

Maor Gottlieb
2021-10-16T07:14:11Z

On 10/16/2021 2:56 AM, David Ahern wrote:
> On 10/14/21 1:53 AM, Mark Zhang wrote:
>> +static int do_stat_mode_parse_cb(const struct nlmsghdr *nlh, void *data,
>> + bool supported)
>> +{
>> + struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {};
>> + struct nlattr *nla_entry;
>> + const char *dev, *name;
>> + struct rd *rd = data;
>> + int enabled, err = 0;
>> + bool isfirst = true;
>> + uint32_t port;
>> +
>> + mnl_attr_parse(nlh, 0, rd_attr_cb, tb);
>> + if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || !tb[RDMA_NLDEV_ATTR_DEV_NAME] ||
>> + !tb[RDMA_NLDEV_ATTR_PORT_INDEX] ||
>> + !tb[RDMA_NLDEV_ATTR_STAT_HWCOUNTERS])
>> + return MNL_CB_ERROR;
>> +
>> + dev = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]);
>> + port = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_PORT_INDEX]);
>> +
>> + mnl_attr_for_each_nested(nla_entry,
>> + tb[RDMA_NLDEV_ATTR_STAT_HWCOUNTERS]) {
>> + struct nlattr *cnt[RDMA_NLDEV_ATTR_MAX] = {};
>> +
>> + err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, cnt);
>> + if ((err != MNL_CB_OK) ||
>> + (!cnt[RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY_NAME]))
>> + return -EINVAL;
>> +
>> + if (!cnt[RDMA_NLDEV_ATTR_STAT_HWCOUNTER_DYNAMIC])
>> + continue;
>> +
>> + enabled = mnl_attr_get_u8(cnt[RDMA_NLDEV_ATTR_STAT_HWCOUNTER_DYNAMIC]);
>> + name = mnl_attr_get_str(cnt[RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY_NAME]);
>> + if (supported || enabled) {
>> + if (isfirst) {
>> + open_json_object(NULL);
> I don't see the close_json_object(). Did you verify json output is proper?

I verified it, the json output is proper.
Anyway, close_json_object() is called in newline(), few lines below.
>
>
>> + print_color_string(PRINT_ANY, COLOR_NONE,
>> + "ifname", "link %s/", dev);
>> + print_color_uint(PRINT_ANY, COLOR_NONE, "port",
>> + "%u ", port);
>> + if (supported)
>> + open_json_array(PRINT_ANY,
>> + "supported optional-counters");
>> + else
>> + open_json_array(PRINT_ANY,
>> + "optional-counters");
>> + print_color_string(PRINT_FP, COLOR_NONE, NULL,
>> + " ", NULL);
>> + isfirst = false;
>> + } else {
>> + print_color_string(PRINT_FP, COLOR_NONE, NULL,
>> + ",", NULL);
>> + }
>> + if (rd->pretty_output && !rd->json_output)
>> + newline_indent(rd);
>> +
>> + print_color_string(PRINT_ANY, COLOR_NONE, NULL, "%s",
>> + name);
>> + }
>> + }
>> +
>> + if (!isfirst) {
>> + close_json_array(PRINT_JSON, NULL);
>> + newline(rd);
>> + }
>> +
>> + return 0;
>> +}
>> +
>