On Mon, Apr 3, 2017 at 3:23 PM, Dmitry Eremin-Solenikov
<dmitry.ereminsoleni...@linaro.org> wrote:
> On 03.04.2017 23:13, Bill Fischofer wrote:
>> On Mon, Apr 3, 2017 at 2:48 PM, Dmitry Eremin-Solenikov
>> <dmitry.ereminsoleni...@linaro.org> wrote:
>>> Hello,
>>>
>>> I was hunting last issues in my IPsec patchset. And suddently I was hit
>>> by the fact that I do not fully understand semantics around
>>> odp_ipsec_result() function. So here comes several questions:
>>>
>>> 1) Is is correct, that I have to free the event manually even after the
>>> successful return from the function?
>>
>> Every event received must be disposed of one way or another. When a
>> worker receives an event of type odp_packet_t it must either free that
>> packet or else send it on to some other processing stage. When an
>> application receives an event of type odp_timeout_t it must also
>> dispose of it either by rearming it or freeing it.
>>
>> An ODP_IPSEC_RESULT event is slightly different in that it is an
>> opaque type that carries within it an odp_ipsec_result_t that may be
>> retrieved from it via odp_ipsec_result(). As described in the doc for
>> that function:
>>
>>  * Copies IPSEC operation results from an event. The event must be of
>>  * type ODP_EVENT_IPSEC_RESULT. It must be freed before the application 
>> passes
>>  * any resulting packet handles to other ODP calls.
>>
>> The "It" here is perhaps a bit ambiguous, but refers to the
>> odp_event_t. The caller supplies the odp_ipsec_result_t as an input to
>> this routine and that is copied from the source event into that
>> parameter (it's defined as an out parameter). Presumably this is just
>> an area on the caller's stack so it requires no explicit freeing.
>>
>> So yes, you always have  to free an event given to you by the
>> scheduler. The odp_event_free() API does that in a universal manner
>> for any type event.
>
> Yep.
>
>>
>>>
>>> 2) What is the expected behaviour of the function if it is called with
>>> result.num_pkt being too small? Should it output packets at this case?
>>> Is it fine to output only some of the fragments from the single input
>>> packet? (not that I support fragmentation at this moment, but still)
>>> If it is called again (with larger num_pkt), should it re-output the
>>> same packets, or should it continue from where it stopped?
>>
>> This is described in the API doc:
>>
>>  * @return Number of packets in the event. If this is larger than
>>  *         'result.num_pkt', all packets did not fit into result struct and
>>  *         application must call the function again with a larger result 
>> struct.
>>
>> So if the rc > result.num_pkt then the returned area will contain the
>> results for packets 0..result.num_pkt-1 and the caller should make the
>> call again with a larger result struct if it wishes to get the results
>> from result.num_pkt..rc-1. I do not believe the intent is that this is
>> stateful, meaning that ODP would remember how many were returned and
>> continue returning from that point since otherwise there would be no
>> need to call with a larger struct (the same struct could be used to
>> iterate over all returned results).
>>
>> This is a good question, however, and is something we may wish to
>> discuss further. I suspect it's easier for implementations to
>> implement this function in a stateless manner, which is why this is
>> phrased that way.
>
> In fact, it would be much simpler (at least for SW implementation) to
> implement it in stateful manner. It would be much simpler for apps to
> read data from the event. I think we might want to discuss it on
> Wednesday and maybe change this behaviour.

Agreed. In the meantime it would be good to get input on this question
from HW implementations.

>
> --
> With best wishes
> Dmitry

Reply via email to