[dpdk-dev] [PATCH v2 01/12] ethdev: add API to query packet type filling info
Ananyev, Konstantin
konstantin.ananyev at intel.com
Thu Feb 25 12:17:48 CET 2016
> >> +int
> >> +rte_eth_dev_get_ptype_info(uint8_t port_id, uint32_t ptype_mask,
> >> + uint32_t ptypes[], int num)
> >> +{
> >> + int ret, i, j;
> >> + struct rte_eth_dev *dev;
> >> + uint32_t all_ptypes[RTE_PTYPE_MAX_NUM];
> >> +
> >> + RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
> >> + dev = &rte_eth_devices[port_id];
> >> + RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_ptype_info_get, -ENOTSUP);
> >> + ret = (*dev->dev_ops->dev_ptype_info_get)(dev, all_ptypes);
> >> +
> >> + for (i = 0, j = 0; i < ret && j < num; ++i)
> >> + if (all_ptypes[i] & ptype_mask)
> >> + ptypes[j++] = all_ptypes[i];
> >> +
> >> + return ret;
> > I think it needs to be something like:
> >
> > j = 0;
> > for (i = 0, j = 0; i < ret; ++i) {
> > if (all_ptypes[i] & ptype_mask) {
> > if (j < num)
> > ptypes[j] = all_ptypes[i];
> > j++;
> > }
> > }
> >
> > return j;
> >
> > Konstantin
> >
>
> You are right, my previous code is wrong.
> But I have a concern about your code above: under the condition that the
> caller does not provide big enough array to store adequate ptypes, it
> has no way to return the not-enough-memory message back to caller.
>
> So under that condition, how about we just return -ENOMEM?
>
As I remember, the agreement was - we don't return an -ENOMEM in that case.
What we do return - number of entries in ptypes[] that would be required to
store all adequate ptypes (similar to what snprinf() does).
So the user can do something like that (if he needs to):
num = rte_eth_dev_get_ptype_info(port, ptype_mask, NULL, 0);
if (num < 0) {/*error handling*/}
ptypes = alloca(num * ptypes[0]);
n = rte_eth_dev_get_ptype_info(port, ptype_mask, ptypes, num);
...
Konstantin
More information about the dev
mailing list