> >> +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