Bill Fischofer(Bill-Fischofer-Linaro) replied on github web page:

platform/linux-generic/odp_ipsec.c
@@ -1055,7 +1069,16 @@ int odp_ipsec_in_enq(const odp_packet_t pkt_in[], int 
num_in,
                result->status = status;
                if (NULL != ipsec_sa) {
                        result->sa = ipsec_sa->ipsec_sa_hdl;
-                       queue = ipsec_sa->queue;
+                       if (ipsec_sa->in.cos && !status.error.all) {
+                               odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+                               const uint8_t *base = odp_packet_data(pkt);
+
+                               queue = cls_pkt_get_queue(pkt_hdr,
+                                                         ipsec_sa->in.cos,
+                                                         base);
+                       } else {


Comment:
Read that again. It specifies a CoS that begins classification, not a queue. 
Putting a packet on a queue does not trigger the classifier. The current 
linux-generic classifier implementation doesn't support this type of "alternate 
entry point", nor does it support decrypted packets that probably don't start 
with L2 headers, etc. That's why I suggest this should probably be its own PR 
because it will involve enhancements to the classifier as well as IPsec to 
achieve the desired result.

> Dmitry Eremin-Solenikov(lumag) wrote:
> @Bill-Fischofer-Linaro quoting spec:
> ```
>                          *  Successfully decapsulated packets are sent to
>                          *  classification through this CoS. Other resulting
>                          *  events are sent to 'dest_queue'. This field is
>                          *  considered only when 'pipeline' is
>                          *  ODP_IPSEC_PIPELINE_CLS. The CoS must not be shared
>                          *  between any pktio interface default CoS. The 
> maximum
>                          *  number of different CoS supported is defined by
>                          *  IPSEC capability max_cls_cos.
> 
> ```


>> Dmitry Eremin-Solenikov(lumag) wrote:
>> Ack, will change.


>>> Dmitry Eremin-Solenikov(lumag) wrote:
>>> @Bill-Fischofer-Linaro the problem here is not in shifting, but in locking 
>>> (this implementation is lock-free). I will take a deeper look on the RFC 
>>> 6479 after finishing IPv6.


>>>> Dmitry Eremin-Solenikov(lumag) wrote:
>>>> @Bill-Fischofer-Linaro well, this is not what API says. Currently if 
>>>> `ODP_PIPELINE_CLS` is selected, IPsec packets go to predefined (per-SA) 
>>>> `odp_cos_t`.


>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>> This test is unnecessary as you're not going to overflow a 64-bit counter.


>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>> This test is going to need revision since the actual CoS is selected as 
>>>>>> a result of filtering the decrypted packet through PMRs that don't exist 
>>>>>> in this version of the test. Another reason to make pipeline support its 
>>>>>> own PR.
>>>>>> 
>>>>>> The test we'd want is
>>>>>> 
>>>>>> - Create a couple of CoS and associated queue objects.
>>>>>> - Create PMRs that filter packets into these CoSes.
>>>>>> - Create plaintext packets that will match the PMRs defined.
>>>>>> - Encrypt these packets via `odp_ipsec_out()`
>>>>>> - Now decrypt them via `odp_ipsec_in_enq()` with pipelining enabled and 
>>>>>> verify that the results show up on the expected queue based on the 
>>>>>> previously defined PMRs.


>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>> Pipelining isn't about sending the result to an alternate queue that's 
>>>>>>> known ahead of time, but rather about sending the result to the 
>>>>>>> `cls_classify_packet()` function so that classification can be run 
>>>>>>> against the decrypted packet and PMRs can filter it into the correct 
>>>>>>> CoS (and associated queue) that is to receive the packet.
>>>>>>> 
>>>>>>> This is likely to be a sufficiently large change in itself that it may 
>>>>>>> be better to be its own PR, in which case this can be pulled from the 
>>>>>>> rest of this PR so that the other changes can be merged first.


>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>> Not urgent, but at some point we should look at [RFC 
>>>>>>>> 6479](https://tools.ietf.org/html/rfc6479) to handle larger windows 
>>>>>>>> needed for large multi-core systems and to do this more efficiently.


>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>> It seems inefficient to incur those two atomic loads on every call. 
>>>>>>>>> How about:
>>>>>>>>> ```
>>>>>>>>> if (ipsec_sa->hard_limit_bytes > 0 && 
>>>>>>>>>     odp_atomic_load_u64(&ipsec_sa->bytes) > 
>>>>>>>>> ipsec_sa->hard_limit_bytes) etc.
>>>>>>>>> ```


https://github.com/Linaro/odp/pull/243#discussion_r150429846
updated_at 2017-11-13 01:57:53

Reply via email to