[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