[dpdk-dev] [PATCH 01/12] ethdev: add API to query what/if packet type is set
konstantin.ananyev at intel.com
Mon Jan 11 11:26:39 CET 2016
> -----Original Message-----
> From: Tan, Jianfeng
> Sent: Monday, January 11, 2016 7:39 AM
> To: Ananyev, Konstantin; Nélio Laranjeiro; dev at dpdk.org
> Subject: Re: [dpdk-dev] [PATCH 01/12] ethdev: add API to query what/if packet type is set
> According to the proposal, I'm going to fix the definition of this API
> as below:
> * Retrieve the contextual information of an Ethernet device.
> * @param port_id
> * The port identifier of the Ethernet device.
> * @param ptype_mask
> * A hint of what kind of packet type which the caller is interested in
> * @param ptypes
> * An array of packet types to be filled with
> * @param num
> * Size of ptypes
> * @return
> * - (>=0) if successful. Indicate number of valid values in ptypes
> * - (-ENOTSUP) if hardware-assisted VLAN stripping not configured.
> * - (-ENODEV) if *port_id* invalid.
> extern int rte_eth_dev_get_ptype_info(uint8_t port_id,
> uint32_t ptype_mask, uint32_t ptypes,
> uint32_t num);
> Unresolved issues:
> 1) When num is exceeded, we just stop there and return num, or return
I think when num is exceeded it should return number of entries enough to
return all requested packet types.
Same as snprintf() does when it has to truncate the output buffer.
> The first way has a bug when: what app is exactly asking for is not
> filled in ptypes because of
> exceeding num, but app believes this API returns with success.
It is a caller responsibility to check the return value and handle it properly.
When return value exceeds num - caller can resize ptypes and call get_ptype_info() again.
> 2) if RTE_PTYPE_*_MAX_NUM macros necessary? Without them, we could calculate
> num through 2^(number of bit 1 in RTE_PTPE_*_MASK).
I don't think caller has to guess somehow what number of entries in ptypes he need .
He can retrieve that information from get_ptype_info() itself.
Something like that for example:
num = rte_eth_dev_get_ptype_info(port, UINT32_MAX, NULL, 0);
if (num < 0) return num;
ptypes = alloca(num * sizeof(ptypes);
ret = rte_eth_dev_get_ptype_info(port, UINT32_MAX, ptypes, num);
if (ret != num) return -1;
More information about the dev